2013-04-30 160 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))