如何替换大稀疏矩阵中的元素?

时间:2017-08-22 09:28:55

标签: matlab replace sparse-matrix

我有一个很大的稀疏矩阵,大约150,000 * 150,000。我需要访问其行,提取非零元素并按照规则替换这些值,如下面的代码:

H = [];
for i = 1: size(A,2)
    [a,b,c] = find(A(i,:)); % extract the rows
    if size(c,2)==1  % only 2
        add = 0;
    elseif size(c,2) > 1 && any(c<2)== 0 % many 2s
        add = c;
        add(1)   = -2;
        add(end) = 2;
        add(2:end-1) = 0;
    elseif size(c,2) > 1 && any(c<2)~= 0 % 2 and 1
        k = find(diff(c)==-1); % find right 2 position
        add = c;
        add(1)   = -1;
        add(end) = -1;
        add(k) = 2;
        add(2:k-1) = 0;
        add(k+1:end-1) = 0;
    end
    %add = diff([0 c(2:end) 0]); % the replacing rule
    aa = i*ones(1,size(a,2)); % return back the old position of rows
    G0 = [aa' b' add']; % put it back the old position with replaced values 
    H = [H; G0];    
end

规则是

  • 将元素2保持在行的最右侧
  • 行中的第一个和最后一个元素替换为-1
  • 所有其他元素都变为0。
  • 如果只有一个元素2,它将被替换为0.
  • 如果有两个或两个以上的2,那么最合适的2将保留 最左边的一个将被替换为-2,中间的元素将替换为0。

这是可视化这些规则的图 enter image description here

左图是从稀疏矩阵中提取的行的非零元素,我希望输出像右图一样。我刚刚选择了一些例子来解释规则。

我确实问了一个类似的问题here并得到了一个很好的答案。规则是行中2个相邻元素之间的差异,以便它可以集成到accumarray函数中。但在这种情况下,规则有点不同,我不知道如何快速执行此任务。稀疏矩阵非常大,所以for循环在这里做的很糟糕。

非常感谢。

0 个答案:

没有答案