我正在寻找一种高效的方法来计算两个大矩阵的Kronecker积。我已经尝试使用方法kronecker()
,如下所示:
I = diag(700)
data = replicate(15, rnorm(120))
test = kronecker(I,data)
然而,执行需要很长时间,然后会出现以下错误:
Error: cannot allocate vector of size 6.8 Gb
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"
kron(I,A)*v
,其中 v
是一个向量,你可以使用 vec(A*V)
来完成。这里的 V
将 v
重塑为一个矩阵。这个方法使用了更一般的规则:vec(ABC)=kron(C',A)*vec(B)
。这避免了形成 Kronecker 乘积,并且使用更少的操作来执行计算。V
可能需要转置。
Matrix
包中的bdiag
函数仅存储非零系数。 - Vincent Zoonekyndbdiag
想法。谢谢。 - Mayou