首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >4x4矩阵函数的网格生成

4x4矩阵函数的网格生成
EN

Stack Overflow用户
提问于 2021-04-01 14:36:47
回答 1查看 94关注 0票数 1

我有一个列和向量,我需要确定构成这些行和的先前矩阵。在回顾了之前的问题之后,我发现过去的这一页给了我一个很好的开端--

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

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

代码语言:javascript
复制
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)
}

您可以在上面链接的页面上看到前面的函数。

每当我在第一个向量上运行这个函数时

代码语言:javascript
复制
c(12,2,3,3,5,4,11,0)

我收到一个错误--

代码语言:javascript
复制
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

关于如何绕过这件事有什么建议吗?

此外,前面链接中的代码运行,但考虑到我需要在数百个向量上执行,这有点慢。我也很好奇,有没有人能提出更快的建议?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-01 15:28:46

下面是使用partitions包的一种方法:

您不需要添加额外的0。

代码语言:javascript
复制
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()

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

下面是一个工作向量的示例:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66906545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档