2016-11-20 7 views
1

これまでと同様の質問をしました。しかし、これは少し難しいです。私は、不定方程式x1+x2+x3 = 8にPOSITIVE INTEGER解(以前は非負解)行列(例えばA)を持っています。また、私は列不定方程式の正の整数解を使って行列を生成する

0 1 0 1 
0 0 1 1 

と別の行列(B発言を)持っている私はAの行を使用して行列とBの列を生成したいです。

たとえば、(2,2,4)は、行列Aの1つの解決策(1行)です。この場合は、repを使用できません。だから行列Bから3列の行列をすべて生成してから、repを適用しようとしましたが、それを理解できませんでした。次の行を使用して、3つの列行列すべてのリストを生成します。例えば

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回目、2回目、3回目の4回を繰り返す。この手順を行列Aのすべての行に使いたいのですが、どうすればいいですか?

答えて

0

?rep(x, 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 
関連する問題