【问题标题】:How to deal with nonzero elements from rows of sparse matrix in Matlab?如何处理Matlab中稀疏矩阵行中的非零元素?
【发布时间】:2017-08-12 18:52:18
【问题描述】:

我正在处理一个相当大的稀疏矩阵,它的大小约为 150,000*150,000。我需要访问它的行,提取非零元素并按照以下规则替换这些值:

tic
H = [];
for i = 1: size(A,2)
    [a,b,c] = find(A(i,:)); % extract the rows
    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
H1 = H(:,1);
H2 = H(:,2);
H3 = H(:,3);
ADD = sparse(H1,H2,H3,nm,nm,nzmax);
toc

我发现find 函数在这段代码中非常耗时(0.1 秒/行),并且在我的稀疏矩阵的当前大小下,这项工作最多需要 33 个小时。我确实相信有一些出路,但我是个新手,编码和处理稀疏矩阵真的很可怕。

你能给我一些想法吗?

【问题讨论】:

    标签: matlab matrix replace sparse-matrix


    【解决方案1】:

    您可以使用find 函数一次将其应用于整个数组,然后使用accumarray 将函数应用于每一行:

    [a b c]=find(A.');
    add=accumarray(b,c,[],@(x){diff([0 ;x(2:end) ;0])});
    H = [b a vertcat(add{:})];
    

    【讨论】:

    • 它就像一个魅力,从几小时到几秒!不知何故,我觉得使用 cell 很糟糕,所以我总是避免使用它。但在这种情况下真的很棒!真是脑洞大开!非常感谢
    猜你喜欢
    • 1970-01-01
    • 2013-03-02
    • 1970-01-01
    • 2012-09-21
    • 1970-01-01
    • 2021-06-16
    • 2017-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多