Matlab不优化以下内容吗?

klo*_*oop 7 matlab matrix sparse-matrix

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

我期待Matlab优化以下内容,所以我不会遇到内存问题:

 A./(v'*w)
Run Code Online (Sandbox Code Playgroud)

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

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

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

Lui*_*ndo 6

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

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

    [ii jj Anz] = find(A);
    Anz./v(ii)'./w(jj).'
    
    Run Code Online (Sandbox Code Playgroud)

    这会给出与您对应的列向量A(find(A))./(v'*w)(find(A)),同样不会生成v.'*w.如果您需要稀疏矩阵A./(v'*w)(而不是其非零值的列向量),请使用sparse(ii,jj,Anz./v(ii)'./w(jj).').