1

2 つのスパース行列 A (論理、80274 x 80274) と B (非負の整数、21018 x 80274)、およびベクトル c (正の整数、21018 x 1) があります。

の結果 res (論理値、21018 x 80274) を見つけたい

mat = B * A;
res = mat > sparse(diag(c - 1)) * spones(mat);

# Note that since c is positive, this is equivalent to
# res = bsxfun(@gt, mat, c-1)
# but octave's sparse bsxfun support is somewhat shoddy,
# so I'm doing this instead as a workaround

問題は、B * A にゼロ以外の値が十分にあることです (60824321 は多くないように思われますが、どういうわけか、spones(mat) の計算は、オクターブがクラッシュする前にギガバイトを超えるメモリを使い果たします)、すべてのマシンのメモリを使い果たします。ただし、これらのほとんどは c-1 を超えません。

中間行列 mat = B * A を計算せずにこれを行う方法はありますか?

明確化: おそらく問題ではありませんが、B と c は実際には double 行列であり、たまたま整数値のみを保持しています (そして B はスパースです)。

4

2 に答える 2

1

のゼロ以外の値に取り組むことはできませんmatか? (ゼロ値の場合、結果は 0 になることがわかっています):

c = c(:); % make c a column
ind = find(mat>0); % linear index
[row, ~] = ind2sub(size(mat),ind); % row index within mat (for use in c)
res = mat(ind) > c(row)-1; % results for the nonzero values of mat
于 2013-10-14T21:19:04.053 に答える
0

Octave 3.8.1 へのアップデートを試みることができます。bsxfun はスパースを認識するようにアップデートされました。これにより、パフォーマンスが大幅に向上します!

于 2014-06-20T14:50:37.607 に答える