7

非常に長いベクトル 1xr v、非常に長いベクトルw1xs 、およびスパースな行列Arxs があります (ただし、次元が非常に大きい)。

以下がMatlabによって最適化されることを期待していたので、メモリの問題は発生しません。

 A./(v'*w)

しかし、メモリ不足の問題が発生しているため、Matlab が実際に完全なv'*w行列を生成しようとしているようです。これを克服する方法はありますか?v'*wの多くの値は であるため、Aすべてを計算する必要はないことに注意してください0

編集:それが可能であれば、それを行う1つの方法はA(find(A))./(v'*w)(find(A));

v'*wただし、最初に計算して変数に入れなければ、行列のサブセット (この場合) を選択することはできません。

4

1 に答える 1

6
  • を使用できますbsxfunA./(v'*w)これにより、行列を生成しない場合と同じ結果が得られますv.'*w

    bsxfun(@rdivide, bsxfun(@rdivide, A, v'), w)
    
  • 別の可能性: ゼロ以外の値のみが必要な場合は、次を使用します。

    [ii jj Anz] = find(A);
    Anz./v(ii)'./w(jj).'
    

    A(find(A))./(v'*w)(find(A))これにより、再び を生成せずに、 に対応する列ベクトルが得られますv.'*w。スパース行列が必要な場合A./(v'*w)(非ゼロ値の列ベクトルの代わりに)、 を使用しますsparse(ii,jj,Anz./v(ii)'./w(jj).')

于 2013-11-01T21:39:22.840 に答える