Kronecker产品适用于大型矩阵

May*_*you 8 r matrix

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

 I = diag(700)
 data = replicate(15, rnorm(120))
 test = kronecker(I,data)
Run Code Online (Sandbox Code Playgroud)

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

 Error: cannot allocate vector of size 6.8 Gb
Run Code Online (Sandbox Code Playgroud)

Ben*_*ker 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"
Run Code Online (Sandbox Code Playgroud)


小智 5

如果您正在计算kron(I,A)*vwherev是向量,您可以使用vec(A*V)whereV重塑v为矩阵来完成此操作。这使用了更一般的规则vec(ABC)=kron(C',A)*vec(B): 。这避免了形成克罗内克乘积,并且使用更少的操作来执行计算。

请注意,V可能需要根据矩阵存储的处理方式(列与行)进行转置。