2012-10-25 167 views
0

我有一個基本矩陣mat,我希望得到一個R對象x = (mat, mat, ...)其中mat重複了100次。如果這是可能的,那麼我可以將x傳遞給一個帶有矩陣名稱向量的函數。我試過rep(mat, 100),但似乎不再維護矩陣類。有什麼建議麼?謝謝!多次重複矩陣,並得到矩陣名稱的向量

更新:基本上,我打算使用

grp.ids <- as.factor(c(rep(1,8), rep(2,4), rep(3,2))) 
x <- model.matrix(~grp.ids) 
do.call(blockMatrixDiagonal, 
      replicate(100, x, simplify=FALSE)) 

其中blockMatrixDiagonal功能可以發現here。然後R給出一個錯誤:要替換的項目數不是替換長度的倍數。我真正希望通過這些編碼獲得的是塊對角矩陣。謝謝:)

+0

你是什麼意思'(墊,墊,..)'是什麼意思?你的意思是你想要得到一個'rows' x'100 * cols'矩陣嗎?一個'100 *行'x'cols'矩陣退出了嗎?一個列表,其中'x [[1]] == mat'?你能舉一個簡單的例子(比如說一個2x3矩陣)以及「需要矩陣名稱向量的函數」是什麼? (注意,矩陣名稱的矢量與矩陣矢量不同(我甚至不知道「矩陣*名稱的矢量*」是什麼意思 - 你是指字符串'mat'?)) –

+0

@ mathematical.coffee:感謝您的評論!實際上,我打算使用的函數需要一個矩陣列表作爲它的參數,它將根據這些傳遞的矩陣生成一個大塊對角矩陣。我希望傳遞給函數的是矩陣名稱「mat」的重複次數爲100次。 – alittleboy

回答

2

您的輸入矩陣不適合構建塊對角矩陣,因爲它不是方陣(即行數等於列數)。

讓我引用塊對角矩陣上的兩個資源。

1)Wikipedia

A block diagonal matrix is a block matrix which is a square matrix, and having main diagonal blocks square matrices

2)功能blockMatrixDiagonal的描述:

builds a block matrix whose diagonals are the square matrices provided.


您可以用功能adiag從包裝magic結合你非方陣。有了您的矩陣x

library(magic) 
do.call(adiag, replicate(100, x, simplify = FALSE)) 
+0

感謝您的意見!是的,我意識到'blockMatrixDiagonal'函數只採用方形矩陣。然而,也許術語「塊診斷矩陣」不是很合適,但可以將非方形矩陣製作爲「塊」,然後製作類似於塊對角線的矩陣,其他所有元素都爲0。 'Matrix'中的'bdiag'函數,但它返回一個S4對象不可能傳遞給我的函數... – alittleboy

+1

@alittleboy請參閱我的答案的更新。 –

+0

非常感謝你!它完美的作品:) – alittleboy

2

對於基礎R解決方案,退房kronecker

?kronecker 
# For your block diagonal matrix: 
kronecker(diag(1, 100), x) 
# or with `%x%` alias 
diag(1, 100) %x% x 

# example 1 
m <- matrix(1:6, nrow = 3) 
kronecker(diag(1, 2), m) 
#  [,1] [,2] [,3] [,4] 
# [1,] 1 4 0 0 
# [2,] 2 5 0 0 
# [3,] 3 6 0 0 
# [4,] 0 0 1 4 
# [5,] 0 0 2 5 
# [6,] 0 0 3 6 

# example 2 
matrix(1, nrow = 2, ncol = 3) %x% m 
#  [,1] [,2] [,3] [,4] [,5] [,6] 
# [1,] 1 4 1 4 1 4 
# [2,] 2 5 2 5 2 5 
# [3,] 3 6 3 6 3 6 
# [4,] 1 4 1 4 1 4 
# [5,] 2 5 2 5 2 5 
# [6,] 3 6 3 6 3 6