4x4矩阵函数的r-网格生成



我有一个列和和行和的向量,我需要确定产生这些行和和和列和的先验矩阵。在浏览了之前的问题后,我发现上一页给了我一个很好的开端——

https://codegolf.stackexchange.com/questions/150012/enumerate-all-possible-grids-of-integers-with-constraints

然而,我的目标与上面的代码有点不同,因为我有一个4x3矩阵,而不是3x3矩阵。我试图将r函数修改为4x4函数——我想我可以在求和中加一个0,这将使它易于扩展。函数看起来像这样--

grid_gen4 <- function(S){
for(m in unique(combn(rep(0:max(S),16),16,matrix,F,4,4)))if(all(c(rowSums(m),colSums(m))==S))print(m)
}

您可以在上面链接的页面上看到前面的功能。

无论何时,我都会在我的第一个矢量上运行此函数

c(12,2,3,3,5,4,11,0)

我收到一个错误--

Error in vector("list", count) : vector size cannot be NA
In addition: Warning message:
In combn(rep(0:max(S), 16), 16, matrix, F, 4, 4) :
NAs introduced by coercion to integer range

关于如何避开这一问题,有什么建议吗

此外,前面链接中的代码运行,但考虑到我需要在数百个向量上执行此操作,速度有点慢。我也很好奇,有没有人对加快速度有什么建议?

以下是partitions包的一种方法:

您不需要添加额外的0。

library(partitions)
findMatrix <- function(target){
cols <- lapply(target[1:3],function(x)compositions(x,4))
grid <- expand.grid(lapply(cols,function(x)seq(ncol(x))))
good <- apply(grid,1,function(x){
all(rowSums(cbind(cols[[1]][,x[1]],cols[[2]][,x[2]],cols[[3]][,x[3]])) == target[4:7])
})  
apply(grid[good,],1, function(x)list(cbind(cols[[1]][,x[1]],cols[[2]][,x[2]],cols[[3]][,x[3]])))
}
findMatrix(c(12,2,3,3,5,4,11))
#list()

没有满足这些条件的矩阵。

下面是一个工作矢量的例子:

findMatrix(c(1,1,0,0,1,1,0))
#$`7`
#$`7`[[1]]
#     [,1] [,2] [,3]
#[1,]    0    0    0
#[2,]    0    1    0
#[3,]    1    0    0
#[4,]    0    0    0
#
#
#$`10`
#$`10`[[1]]
#     [,1] [,2] [,3]
#[1,]    0    0    0
#[2,]    1    0    0
#[3,]    0    1    0
#[4,]    0    0    0

要了解它是如何工作的,请考虑以下内容:

compositions(4,4)                                                                        
#[1,] 4 3 2 1 0 3 2 1 0 2 1 0 1 0 0 3 2 1 0 2 1 0 1 0 0 2 1 0 1 0 0 1 0 0 0
#[2,] 0 1 2 3 4 0 1 2 3 0 1 2 0 1 0 0 1 2 3 0 1 2 0 1 0 0 1 2 0 1 0 0 1 0 0
#[3,] 0 0 0 0 0 1 1 1 1 2 2 2 3 3 4 0 0 0 0 1 1 1 2 2 3 0 0 0 1 1 2 0 0 1 0
#[4,] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 4

一旦我们枚举了所有可能的列,这些列加起来就是一个给定的数字,我们就可以使用expand.grid迭代所有可能的柱组合,看看它们是否有等于我们约束的rowSums

最新更新