在Matlab中以块的形式存储稀疏矩阵?

时间:2013-09-09 18:47:46

标签: matlab sparse-matrix

我必须执行此操作:

N = A'*P*A

P矩阵的结构是块对角线,而A矩阵很大程度上是稀疏的(也是带状结构)。乘法以块的形式执行。但问题是存储。

N矩阵太大而无法完整存储(尝试分配时内存不足)。所以,我想以稀疏的方式存储。虽然稀疏命令只生成行,列格式的值,但它是否可以应用于存储带有列列作为块索引的带状矩阵?

我在spalloc问题中尝试了this,但它没有帮助存储块的行和索引。 谢谢。

enter image description here A P A'形成的图像

问题在于块。这些块本身很稀疏。因此,可以在保存时将块作为稀疏矩阵。 那么,如果一个块的行= 1且col = 1,那么可以这样做吗?

N(row,col) = sparse(A'*P*A)

1 个答案:

答案 0 :(得分:1)

可能还有一些额外的技巧,但首先要尝试的是确保永远不会在内存中创建完整的矩阵N。当前的问题是,如果您拨打sparse(A'*P*A),那么您需要多个A'*P,然后(A'*P) * A,然后才能使其稀疏并取出零。在使其稀疏之前,N的整个非稀疏矩阵表示在内存中。要强制MATLAB更智能,请执行以下操作:

SA = sparse(A);
N =  SA'*sparse(P)*SA;
whos N

您应该看到N是稀疏的,但更重要的是,每个乘法结果也是稀疏的,因为您将稀疏矩阵乘以稀疏矩阵。