在matlab中的产品密集矩阵*稀疏矩阵中,我该如何只计算特定的条目?

时间:2014-05-27 22:25:59

标签: performance matlab matrix product sparse-matrix

我们有一个matlab程序,我们想在其中计算以下表达式:

sum(  (M*x) .* x) 

这里,M是一个小的密集矩阵(比如说100乘100),而x是一个稀疏的脂肪矩阵(比如大小100乘1 000 000,有5%的非零项) 。当我运行代码时,首先计算M*x,这是一个密集矩阵 - 然而,计算该矩阵的大部分计算完全是浪费时间,因为大部分时间都是零 - 然后在x之后用逐点产品编辑。

换句话说:我想要做的只是计算(i,j)的{​​{1}}条目,这些条目对应M*x非{0}的(i,j)。最后,我还会对每个列数感兴趣。

开始时似乎很简单,但我无法弄清楚如何告诉matlab这样做或如何重塑计算以便matlab有效地完成它。我真的想避免为这个操作编写一个mex文件,这个操作占用了大部分的计算时间。

以下是用于比较的代码段:

x(i,j)

1 个答案:

答案 0 :(得分:1)

要计算(M*x) .* x:找到最终结果的哪些条目可以非零(使用find),只为那些(sum(M(...).'.*x(...)) .* nonzeros(x).')手动计算,并从该构建中最终矩阵(使用sparse):

[ii jj] = find(x);
R = sparse(ii, jj, sum(M(ii,:).'.*x(:,jj)) .* nonzeros(x).');

当然,要计算sum((M*x) .* x),您只需使用

即可
full(sum(R))