2013-04-30 3 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) для использования '% X%'. Можете ли вы вкратце объяснить, как это работает? Документация очень ограничена. – Nishanth

+1

Возможно, эта ссылка поможет: http://en.wikipedia.org/wiki/Kronecker_product. Сделав одну из двух матриц одной строкой, я фактически повторяю всю матрицу, немного похожую на функцию 'rep' для векторов. Используя ту же аналогию 'rep', порядок аргументов - это разница между использованием' times' или 'each'. – flodel

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)) 
Смежные вопросы