我有一个非常长的向量1xr v
,一个非常长的向量w
1xs,以及一个矩阵A
rxs,它是稀疏的(但尺寸非常大)。 / p>
我希望Matlab能够优化以下内容,这样我就不会遇到内存问题:
A./(v'*w)
但似乎Matlab实际上是在尝试生成完整的v'*w
矩阵,因为我遇到了内存不足的问题。有办法克服这个问题吗?请注意,无需计算所有v'*w
,因为A
的许多值均为0
。
编辑:如果可行,那么一种方法就是A(find(A))./(v'*w)(find(A));
但是你不能先选择一个矩阵的子集(在这种情况下是v'*w
)而不先计算它并将它放在一个变量中。
答案 0 :(得分: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).')
。