4

私は次のコードを実行しています。ここで、Mは〜200,000 x〜200,000のスパース行列であり、〜200,000x2の行列pointsです。

inds=sub2ind(size(M),points(:,1),points(:,2));
M(inds)=M(inds)+1;

問題は、2行目の実行に非常に長い時間がかかることです(15〜90秒)。indsのインデックスの数が「新規」である(つまり、スパース行列に値がまだない)場合は、操作に時間がかかります。

これを行うためのより効率的な方法はありますか?

4

1 に答える 1

4

ここにアイデアがあります:

M = M + sparse(points(:,1),points(:,2),1,size(M,1),size(M,2),size(points,1));

ちょうどあなたが知っているので、

S = sparse(i,j,s,m,n,nzmax)ベクトル、、を使用しij、が、非ゼロに割り当てられたスペースを持つようなスパース行列をs生成 します。ベクトル、、、およびはすべて同じ長さです。ゼロの要素は、対応するとの値とともに無視されます。の値が重複している要素はすべて、一緒に追加されます。mnS(i(k),j(k)) = s(k)nzmaxijssijsij

好奇心旺盛な方へ:

M = sprand(200000,200000,1e-6);
points = [randperm(200000) ; randperm(200000)]'; %'//Initialization over
Mo = M;
tic; 
inds=sub2ind(size(Mo),points(:,1),points(:,2));
Mo(inds) = Mo(inds)+1;
toc
tic; 
M = M + sparse(points(:,1),points(:,2),1,size(M,1),size(M,2),size(points,1));
toc
于 2012-10-07T00:45:12.300 に答える