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 はスパースです)。