Kronecker产品适用于大型矩阵

时间:2013-09-17 12:59:36

标签: r matrix

我正在寻找一种计算两个大型矩阵的Kronecker积的有效方法。我尝试使用方法kronecker(),如下所示:

 I = diag(700)
 data = replicate(15, rnorm(120))
 test = kronecker(I,data)

但是,执行需要很长时间,然后会出现以下错误:

 Error: cannot allocate vector of size 6.8 Gb

2 个答案:

答案 0 :(得分:11)

只要您使用Matrix::Diagonal构建对角矩阵,您就会自动将test对象构造为稀疏矩阵:

library(Matrix)
I=Diagonal(700)
data = replicate(15,rnorm(120))
system.time(test <- kronecker(I,data))
##   user  system elapsed
##  0.600   0.044   0.671 
dim(test)
## [1] 84000 10500
format(object.size(test),"Mb")
## [1] "19.2 Mb"

答案 1 :(得分:4)

如果您正在计算kron(I,A)*v其中v是向量,您可以使用vec(A*V) Vv重新整形为vec(ABC)=kron(C',A)*vec(B)到矩阵中。这使用了更为一般的V规则。这避免了形成Kronecker产品并使用少得多的操作来执行计算。

请注意,{{1}}可能需要转置,具体取决于矩阵存储的处理方式(列与行)。