我有以下问题,类似: Doesn't Matlab optimize the following?
但这是一个更难的变体,解决方案表明它不起作用。
我有一个非常长的矩阵n x r V,一个非常长的矩阵W n x s和一个矩阵A rxs,它是稀疏的(但尺寸非常大)。
我希望Matlab能够优化以下内容,这样我就不会遇到内存问题:
一个./(V'* W)
但似乎Matlab实际上是在尝试生成完整的V'* W矩阵,因为我遇到了Out of memory问题。有办法克服这个问题吗?请注意,不需要计算所有V'* W,因为A的许多值都是0.
如果可行,一种方法是做A(找(A))./(V'* W)(找(A));
但是你不能先选择一个矩阵的子集(在这种情况下为V'* W),而不先计算它并将其放在一个变量中。
(与前一个问题的主要区别在于:V和W不仅仅是向量,而是矩阵。)
答案 0 :(得分:1)
可以推广上一个问题的answer以计算A./(V'*W)
的非零值,如下所示:
[ii jj Anz] = find(A);
result = arrayfun(@(n) Anz(n) / ( V(:,ii(n))'*W(:,jj(n)) ), 1:length(ii) );
这避免了计算完整矩阵V'*W
,因为它只计算该矩阵的所需条目(即A
的相应条目非零的那些条目),一次一个。因此内存使用率很低。至于速度,使用arrayfun
通常很慢,但如果A
的非零值很少,则不需要很长时间。
当然,您可以生成稀疏矩阵A./(V'*W)
为sparse(ii,jj,result)
。