使用不定方程的正整数解生成矩阵

时间:2016-11-20 18:52:14

标签: r

我之前问了一个与此类似的问题。但这一点有点棘手。我有不确定方程A的POSITIVE INTEGER解决方案(以前的NON-NEGATIVE解决方案)矩阵(比如x1+x2+x3 = 8)。另外,我还有另一个矩阵(比如B)和列

0 1 0 1
0 0 1 1

我想使用A行和B列生成矩阵。

例如,让(2,2,4)是矩阵A的一个解决方案(一行)。在这种情况下,我无法使用rep。所以我尝试从矩阵B生成所有三个列矩阵,然后尝试应用rep,但无法解决这个问题。我使用以下行生成所有三个列矩阵的列表。

cols <- combn(ncol(B), 3, simplify=F, FUN=as.numeric)
M3 <- lapply(cols, function(x) cbind(B[,x]))

例如,cols[[1]] [1] 1 2 3

然后,我的新矩阵的列将是

0 0 1 1 0 0 0 0
0 0 0 0 1 1 1 1

该新矩阵的列是B的列的倍数,即,第一列2次,第二列2次和第3列4次。我想在矩阵A的所有行中使用此过程。我该怎么做?

1 个答案:

答案 0 :(得分:0)

?rep(x, times)说;

  

如果times是与x相同长度的向量(在复制之后)   每个),结果由x [1]重复次数[1]次,x [2]组成   重复次数[2]次等等。

基本理念是;

B <- matrix(c(0, 1, 0, 1, 0, 0, 1, 1), byrow = T, nrow = 2)
cols <- combn(ncol(B), 3, simplify=F, FUN=as.numeric)

a1 <- c(2, 2, 4)    
cols[[1]]  # [1] 1 2 3
rep(cols[[1]], a1)   # [1] 1 1 2 2 3 3 3 3

B[, rep(cols[[1]], a1)]
#      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
# [1,]    0    0    1    1    0    0    0    0
# [2,]    0    0    0    0    1    1    1    1
 
testA <- rbind(c(2,2,4), c(2,1,5), c(2,3,3))

 ## apply(..., lapply(...)) approach (output is list in list)
apply(testA, 1, function(x) lapply(cols, function(y) B[, rep(y, x)]))

 ## other approach using combination of indices
ind <- expand.grid(ind_cols = 1:length(cols), ind_A = 1:nrow(testA))
col_ind <- apply(ind, 1, function(x) rep(cols[[x[1]]], testA[x[2],]))

lapply(1:ncol(col_ind), function(x) B[, col_ind[,x]])   # output is list

library(dplyr)
apply(col_ind, 2, function(x) t(B[, x])) %>% matrix(ncol = 8, byrow=T)  # output is matrix