3

S- NxNスパース行列。
A- Mx1 ベクトル。

のゼロ以外の値Sは のインデックスですA。の' 番目のエントリで:の' 番目の行の ゼロ以外の値ごとに、このすべての合計を計算して計算し、それを の' のエントリに入れるような
ベクトルを計算したい。xix
jiSA[j]jix

疑似では、次のようになります。

  for i = 1:N
     for j = 1:N
        if( s[i][j] != 0)
           x[i] += s[ A[i,j] ]

最も効率的な方法でmatlabでそれを行うにはどうすればよいですか?

4

3 に答える 3

1

findと を使ってみましょうaccumarray:

[ii jj sij] = find( S );
x = accumarray( ii, A(sij), [1 size(S,1)] );
于 2015-04-16T10:17:07.647 に答える
0

これは実際にはShaiの答えに似ていますが、sijの代わりにnonzeros(S)を使用しています:

[ii jj] = find( S );
x = accumarray( ii, A(nonzeros(S)), [size(S,1), 1] ).' 
于 2015-04-16T15:09:41.123 に答える
0

これは単なる行列の乗算です:

x = (S~=0)*A(1:size(S,2));

Matlab はスパース行列を使って行列の乗算を効率的に行うため、これはかなり高速です。

于 2015-04-16T10:35:32.407 に答える