我有两个稀疏矩阵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)的计算在octave崩溃之前耗尽了超过1 GB的内存)以耗尽所有我的机器内存,即使其中大部分都不超过c-1。
有没有办法在不计算中间矩阵mat = B * A的情况下做到这一点?
澄清:它可能没关系,但B和c实际上是双矩阵,碰巧只是保持整数值(而B是稀疏的)。
答案 0 :(得分: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
答案 1 :(得分:0)
您可以尝试更新到Octave 3.8.1,bsxfun已经更新为稀疏感知,这大大提升了性能!