如何在Matlab中进行以下计算?

时间:2013-11-02 07:26:40

标签: matlab matrix sparse-matrix

我有以下问题,类似: 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不仅仅是向量,而是矩阵。)

1 个答案:

答案 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)