2

MATLABには、遷移確率を含む大きな行列transition_probsと、隣接行列がありadj_matます。列に沿って遷移行列の累積合計を計算し、要素ごとに、この方法でマスクとして機能する隣接行列に対して乗算します。

cumsumTransitionMat = cumsum(transition_probs,2) .* adj_mat;

cumsumマトリックスのすべてのエントリが非ゼロであるため、MEMORY エラーが発生します。

そもそもゼロ以外のエントリがある累積合計エントリのみを使用することで、この問題を回避したいと思います。forループを使用せずにこれを行うにはどうすればよいでしょうか?

4

2 に答える 2

2

CUMSUM が行に適用されると、行ごとに最初のゼロ以外の列から始まり、最後の列まで値が入力されます。これが定義によるものです。

ストレージに関して最悪のケースは、スパース行列の最初の列に値が含まれている場合です。最良のケースは、すべての非ゼロ値が最後の列にある場合です。例:

% worst case
>> M = sparse([ones(5,1) zeros(5,4)]);
>> MM = cumsum(M,2);       % completely dense matrix
>> nnz(MM)
ans =
    25

% best case
>> MM = cumsum(fliplr(M),2);

結果の行列がメモリに収まらない場合、行に対して for ループを使用し、行列をより小さなバッチで処理することを除いて、他に何ができるかわかりません...

結果が変わるため、累積合計を計算する前にマスキング操作を適用できないことに注意してください。だからあなたは言うことができませんcumsum(transition_probs .* adj_mat, 2)

于 2013-09-13T11:36:12.137 に答える