稀疏矩阵在循环中很慢,如何在 Matlab 中加快它的速度

Sparse matrix is very slow in loop, how to speed it up in Matlab

我有一个巨大的矩阵(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

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

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

谢谢

正如上面提到的@beaker,以及我在 Accelerating Matlab Performance 一书中所解释的那样,使用 sparsespdiags 函数比在您的代码中使用索引分配。

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

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

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