【问题标题】:Storing a sparse matrix in blocks in Matlab?在 Matlab 中以块的形式存储稀疏矩阵?
【发布时间】:2013-09-09 18:47:45
【问题描述】:

我必须执行这个操作:

N = A'*P*A

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

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

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

A P A' 形成的图像

问题在于块。这些块本身是稀疏的。那么是否可以在保存时将块本身制作为稀疏矩阵。 那么,如果一个块有 row = 1 和 col = 1,那么可以这样做吗?

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

【问题讨论】:

  • 您能否提供一些示例代码来创建类似的感兴趣的 A 和 P?
  • @Steve 我为 A 和 P 分享了一张图片以显示结构。
  • 到底是什么问题?如果你知道块内的坐标,所有块的大小,以及它是哪个块;那你就什么都知道了。
  • 我想实现两个稀疏级别,将各个块存储为稀疏矩阵。有可能吗?
  • @shunyo 将所有块定义为稀疏块,然后执行乘法运算。

标签: matlab sparse-matrix


【解决方案1】:

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

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

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

【讨论】:

  • 这很棒。谢谢。
猜你喜欢
  • 2016-01-25
  • 2018-01-19
  • 2013-04-11
  • 1970-01-01
  • 2011-03-29
  • 2012-12-10
  • 1970-01-01
  • 2017-07-21
  • 2012-04-02
相关资源
最近更新 更多