2013-04-30 243 views
2

我已經從組合合併多個組合一起矩陣

mat1 <- combn(10, 2) 
mat2 <- combn(20, 3) 

MAT1是一個2x45和MAT2是一個3x1140內置兩個矩陣。

我想要產生的是可能的組合,假設您按順序執行兩個操作。所以前10位選擇2,緊接着是20選3,所有的組合是什麼。我想製作一個有5行和51300列的矩陣。第一列值爲(1,2,1,2,3)

什麼是最合適的實現方式?

回答

2

有趣的問題。這裏是一個解決方案,它利用了一對夫婦克羅內克產品:

one1 <- matrix(1, ncol = ncol(mat1)) 
one2 <- matrix(1, ncol = ncol(mat2)) 

rbind(mat1 %x% one2, one1 %x% mat2) 

rbind(one2 %x% mat1, mat2 %x% one1) 

,這取決於組合矩陣,你首先要回收。

+0

(1),用於使用'%×%'。你能簡單解釋它是如何工作的嗎?文檔非常有限。 – Nishanth 2013-04-30 03:21:33

+1

也許這個鏈接將有助於:http://en.wikipedia.org/wiki/Kronecker_product。通過將兩個矩陣中的一個矩陣作爲一行,我有效地重複了整個矩陣,有點像'rep'函數對於向量的功能。再次使用相同的'rep'類比,參數的順序是使用'times'或'each'的區別。 – flodel 2013-04-30 03:51:52

2

使用expand.grid另一種可能的解決方案:

idx = expand.grid((1:ncol(mat1)),(1:ncol(mat2))) 

rbind(mat1[,idx[,1]], mat2[,idx[,2]]) 

推廣到任何數量的矩陣:

mat.list <- list(mat1, mat2) 
idx <- expand.grid(lapply(lapply(mat.list, ncol), seq_len)) 
do.call(rbind, mapply(function(x, j)x[, j], mat.list, idx))