1

我有以下类似的问题: Matlab 不优化以下内容吗?

但这是一个更难的变体,并且那里建议的解决方案不起作用。

我有一个非常长的矩阵 nxr V、一个非常长的矩阵 W nxs 和一个矩阵 A rxs,它是稀疏的(但尺寸非常大)。

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

A./(V'*W)

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

如果可能的话,一种方法是做 A(find(A)) ./ (V'*W)(find(A));

但是如果不先计算矩阵并将其放入变量中,则无法选择矩阵的子集(在本例中为 V'*W)。

(与上一个问题的主要区别:V 和 W 不仅仅是向量,而是矩阵。)

4

1 回答 1

1

上一个问题的答案可以概括为计算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).

于 2013-11-02T10:53:51.667 回答