我们有一个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)
答案 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))