2017-08-12 78 views
0

我正在處理一個相當大的稀疏矩陣,它的大小約爲150,000 * 150,000。我需要以下的規則如下面的代碼來訪問到它的行,提取非零元素並更換這些值:如何在Matlab中處理稀疏矩陣行中的非零元素?

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.1S /行)在這個代碼和我的稀疏矩陣的當前大小,這項工作需要我大約33個小時。我相信有一些出路,但我是如此新生的編碼和處理稀疏矩陣真的很可怕。

你願意給我一些想法嗎?

回答

1

可以使用find功能,一旦將其應用於整個陣列上,然後使用accumarray適用於各行的功能:

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

它就像一個魅力,從幾個小時到秒!不知何故,我有一個印象,使用細胞是可怕的,所以我總是避免它。但在這種情況下真的很棒!真的很開心!非常感謝 – chappi

相關問題