Matlab是否优化以下内容?

7

我有一个非常长的1xr向量v,一个非常长的1xs向量w和一个稀疏的rxs矩阵A(但在维度上非常大)。

我原本期望Matlab能够优化下列代码,以避免内存问题:

 A./(v'*w)

但是似乎Matlab实际上正在尝试生成完整的v'*w矩阵,因为我遇到了内存不足的问题。有没有办法克服这个问题?请注意,并不需要计算所有v'*w,因为许多A的值都是0

编辑:如果可能的话,一种方法是执行A(find(A))./(v'*w)(find(A));

但是你不能选择一个矩阵的子集(在这种情况下是v'*w),而不先计算它并将其放入变量中。


1
你可能想要使用spfun代替 -- "将函数应用于非零稀疏矩阵元素" - Ben Voigt
嗯... spfun可能是一个不错的线索,但我不确定如何在这种情况下使用它。首先,被评估的函数不知道它应用于矩阵单元格的索引。 - kloop
1个回答

6
  • You could use bsxfun. This gives the same result as A./(v'*w) without generating the matrix v.'*w:

    bsxfun(@rdivide, bsxfun(@rdivide, A, v'), w)
    
  • Another possibility: if you only want the nonzero values, use:

    [ii jj Anz] = find(A);
    Anz./v(ii)'./w(jj).'
    

    This gives a column vector corresponding to your A(find(A))./(v'*w)(find(A)), again without generating v.'*w. If you need the sparse matrix A./(v'*w) (instead if the column vector of its nonzero values), use sparse(ii,jj,Anz./v(ii)'./w(jj).').


又是一个 rdivide 的答案!非常好。但是由于内存问题,可能需要非零解,不过我看你已经重新排列了术语来解决这个问题。 - chappjc
@chappjc 是的,自从我学习了bsxfun之后,我倾向于将其应用到所有东西上 :-) 我不明白你关于重新排列术语的观点。 - Luis Mendo
kloop已经将(v'*w)分组,但您可以按顺序处理它们。这只是我一开始没有意识到的问题本质。因此,在我刚刚尝试的一个测试案例中,答案实际上与参考答案相差5.8208e-11... 机器精度误差在积累,但仍然很小。 - chappjc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接