1

我有两个稀疏矩阵 A(逻辑,80274 x 80274)和 B(非负整数,21018 x 80274)和一个向量 c(正整数,21018 x 1)。

我想找到结果 res (logical, 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 看起来并不多,但不知何故,在 octave 崩溃之前,spones(mat) 的计算会占用超过 1 GB 的内存)以耗尽我所有机器的内存即使其中大多数不超过c-1。

有没有办法在不计算中间矩阵 mat = B * A 的情况下做到这一点?

澄清:这可能无关紧要,但 B 和 c 实际上是双矩阵,碰巧只保存整数值(并且 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 回答