我之前问了一个与此类似的问题。但这一点有点棘手。我有不确定方程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的所有行中使用此过程。我该怎么做?
答案 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