【问题标题】:Sparse matrix is very slow in loop, how to speed it up in Matlab稀疏矩阵循环很慢,如何在Matlab中加快速度
【发布时间】:2015-06-24 17:01:06
【问题描述】:

我有一个巨大的矩阵(584064x5369468),我必须在 Matlab 中使用稀疏矩阵,但在我的计算中,为稀疏矩阵赋值非常慢。我迫不及待地想完成它,我该怎么办。

cgm=sparse(584064,5369468);
[Xcp, Ycp, Zcp] = ndgrid(-[1:336],-[1:45],-[1:336]);
% dp my data which is loaded

for sg=1:335 
    for tg=1:44
        for rg=1:335
            % ii is a vector i.e the size of ii = 309x1
            fprintf('Constructing patch: %i %i %i',sg,tg,rg)
            ii=find(abs((Xcp(sg,tg,rg))<=abs(dp(:,1)))&abs((dp(:,1))<abs(Xcp(sg+1,tg,rg)))&(abs(Ycp(sg,tg,rg))<=abs(dp(:,2)))& (abs(dp(:,2))<abs(Ycp(sg,tg+1,rg)))& (abs(Zcp(sg,tg,rg))<=abs(dp(:,3)))&(abs(dp(:,3))<abs(Zcp(sg,tg,rg+1))));

              % jj is another vector i.e the size of jj = 64*1
              %the ii size is changing every time but the size of jj is always 64. ii is non-zero values and can be between 1 and 584064 .
              % c is my matrix after calculation i.e c = 309x64
             cgm(ii,jj)=c;
        end
     end
end

对于第一个内部循环,它运行得非常快,但它变得越来越慢。

我知道给稀疏矩阵赋值意味着重新打包所有东西,而且速度很慢,但是如何在我的代码中减少它的重新打包呢?

谢谢

【问题讨论】:

  • 我不明白你在做什么。您没有使用循环变量,我不知道该分配如何与 iijj 的大小不同。
  • @beaker 我使用循环变量来生成 ii 和 jj 值。我应该更新我的代码吗?
  • 我仍然对您的计算感到非常困惑,但是您应该累积每个非零的行、列和值并使用S = sparse(i, j, v),如图所示here(或者可能是S = sparse(i, j, v, m, n) )。
  • @Ehsan - 添加到ndgrid 的那些负面消息以前不存在。不管怎样,谢谢。
  • @Ehsan - ijv 都是 N x 1 向量并填充您的稀疏矩阵 C,使得 C(i(k), j(k)) = v(k) 对应于 k = 1, 2, ... , N。所有其他值将为零。我还建议您覆盖大小并执行 C = sparse(i, j, v, 584064,5369468); 以确保您获得所需的大小。

标签: matlab matrix sparse-matrix


【解决方案1】:

正如上面提到的@beaker 以及我在加速 Matlab 性能 一书中所解释的那样,使用 sparsespdiags 函数比在代码中使用索引赋值要快得多。

原因是任何此类分配都会导致重建稀疏数据的内部表示,当需要重新排列的数据元素越多时,这种表示就越慢。

相反,您应该在循环内将数据索引(iijj)以及分配的数据(c)累积到三个单独的数组中,然后,在外部 循环使用对sparse(ii,jj,c) 的一次调用来一次更新矩阵。这会快得多。

有关稀疏数据的更多详细信息和建议,请参阅我书中的第 137-140 页。

【讨论】:

  • 感谢您的回复,我现在正在做同样的事情。等待结果。再次感谢
猜你喜欢
  • 1970-01-01
  • 2021-09-21
  • 1970-01-01
  • 1970-01-01
  • 2015-04-07
  • 2017-12-05
  • 2013-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多