7

我有一个很长的向量 1xrv和一个很长的向量w1xs 和一个矩阵Arxs,它是稀疏的(但尺寸非常大)。

我期待 Matlab 对以下内容进行优化,这样我就不会遇到内存问题:

 A./(v'*w)

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

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

v'*w但是如果不先计算矩阵并将其放入变量中,则无法选择矩阵的子集(在这种情况下)。

4

1 回答 1

6
  • 你可以使用bsxfun. A./(v'*w)这给出了与不生成矩阵相同的结果v.'*w

    bsxfun(@rdivide, bsxfun(@rdivide, A, v'), w)
    
  • 另一种可能性:如果您只想要非零值,请使用:

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

    这给出了一个对应于你的列向量A(find(A))./(v'*w)(find(A)),再次没有生成v.'*w。如果您需要稀疏矩阵A./(v'*w)(而不是其非零值的列向量),请使用sparse(ii,jj,Anz./v(ii)'./w(jj).').

于 2013-11-01T21:39:22.840 回答