3

設定はこちらです。

X:6000x8000非スパース行列

B:数十の非ゼロのみを含む8000x1のスパースベクトル

d:正の数

M:はスパース化されたX'Xです。つまり、大きさがdより小さい要素を0にしきい値処理します。数百の要素だけが残ります。したがって、(X'* X --M)には多くの小さな要素があり、スパースではありません。

ベクトルy=(X'* X --M)* Bを計算したいので、y = X'*(X * B)-M*Bと書き直すことができます。最初の部分は十分に高速ですが、2番目の部分はX'* Xを含み、非常に低速です。

誰かが私がこの計算を加速するのを手伝ってくれるでしょうか?

どうもありがとう!

4

1 に答える 1

1

あなたはそれが非常にまばらであると説明しますB:長さ8000の列配列のゼロ以外の数十の値。その結果、次のように乗算を高速化できると思いますB。まず、ゼロ以外の値のインデックスを次の場所で見つけることができますB

nzIndex = find(B);

y次に、次のように計算を変更できます。

Bnz = B(nzIndex);  %# Non-zero values in B
y = X.'*(X(:,nzIndex)*Bnz) - M(:,nzIndex)*Bnz;
于 2011-03-29T03:15:49.063 に答える