bsxfun
のような要素単位の操作を実行する方法はありますか?は疎行列の非ゼロ要素で動作しますか?特にspfunがbsxfunと出会う場所
、位置(i,j)
におけるマトリックスA
における各非ゼロ要素のI要素(i,j)
を除いて、i
行目の非零要素のすべての製品を検索します。例えば
i-th
行はこのように見える場合:結果は次のようになります。
:
0 12 20 0 0 15 0 0
最も明白な解決策は、非の製品を取るように見えます各行に沿ってゼロ要素を計算し、各要素を列積から戻します。したがって、上記の例では、行の積は5 x 3 x 4 = 60
であり、次にそれぞれの位置で5
3
と4
を除算します。疎行列A
考える
が、これはこれまでのところ私の最高のソリューションです:
[M N] = size(A);
[row col vals] = find(A);
row_prod = accumarray(row,vals,[],@prod);
B = bsxfun(@ldivide, A, row_prod);
B = sparse(row,col,B(sub2ind([M N],row,col)),M,N);
最初の3行は、私が欲しいものを達成:各行の非ゼロ要素の積を表す列ベクトルを。しかし、最後の2行にはかなりの問題があります。
bsxfun
は、不必要にゼロ除算サイクルの多くを無駄になるだろうA
Inf
または-Inf
で構成されている行列です。ここで、実際にはゼロが欲しいです。NaN
と定義しているので、Inf
をマスクすることはできません。弾丸を噛んで、for-loopを書くだけでいいですか?それともそれにアプローチする別の方法がありますか?