2017-08-12 28 views
0

私はかなり大きな疎なマトリックスを取り扱っています、そのサイズは約150,000 * 150,000です。私はfind機能が実際に(0.1秒/行)を消費する時間であることがわかっ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 

:私は以下のコードのようにルール以下、これらの値を、その列にアクセスする非ゼロ要素を抽出し、交換する必要がありますこのコードとこの現在の疎な行列のサイズでは、この仕事には約33時間かかります。私はそこにいくつかの方法があると信じていますが、私はコーディングやスパース行列を扱うような新生児は本当に恐ろしいです。

私にいくつかのアイデアを教えてもらえますか?

答えて

1

あなたは、各行に関数を適用するaccumarrayを使用し、その後、一度配列全体にそれを適用するfind機能を使用することができます。

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

それは時間から秒に、魔法のように動作します!どういうわけか私はセルを使うことはひどいと感じていましたので、私はいつもそれを避けています。しかし、この場合は本当に素晴らしいです!本当に心を開いた!どうもありがとう – chappi

関連する問題