Performance 在matlab中的积密集矩阵*稀疏矩阵中,如何才能只计算特定的条目?
我们有一个matlab程序,在其中我们要计算以下表达式:Performance 在matlab中的积密集矩阵*稀疏矩阵中,如何才能只计算特定的条目?,performance,matlab,matrix,product,sparse-matrix,Performance,Matlab,Matrix,Product,Sparse Matrix,我们有一个matlab程序,在其中我们要计算以下表达式: sum( (M*x) .* x) 这里,M是一个小的密集矩阵(比如100×100),而x是一个稀疏的胖矩阵(比如大小为100×1000000,有5%的非零条目)。当我运行代码时,首先计算M*x,这是一个密集的矩阵——然而,计算该矩阵的大部分计算完全是浪费时间,因为大部分计算都将在与x的逐点积中归零 换句话说:我想做的是只计算那些(I,j)的M*x的条目,它们对应于(I,j),其中x(I,j)是非零的。最后,我还将只对每个列计数感兴趣
sum( (M*x) .* x)
这里,M
是一个小的密集矩阵(比如100×100),而x
是一个稀疏的胖矩阵(比如大小为100×1000000,有5%的非零条目)。当我运行代码时,首先计算M*x
,这是一个密集的矩阵——然而,计算该矩阵的大部分计算完全是浪费时间,因为大部分计算都将在与x
的逐点积中归零
换句话说:我想做的是只计算那些(I,j)
的M*x
的条目,它们对应于(I,j)
,其中x(I,j)
是非零的。最后,我还将只对每个列计数感兴趣
一开始似乎很简单,但我不知道如何告诉matlab这样做,或者如何重塑计算,以便matlab高效地完成。我真的不想为这个操作编写一个mex文件,这个操作占用了大部分计算时间
下面是一段代码片段以供比较:
m = 100;
n = 100000;
density = 0.05;
M = randn(m); M = M * M';
x = sprandn(m,n,density);
tic
for i = 1:100
xsi = sum((M * x).*x,1);
end
toc
Elapsed time is 13.570713 seconds.
要计算(M*x)。*x
:查找最终结果的哪些项可以是非零的(使用find
),仅手动计算那些(sum(M(…).*x(…).*nonzero(x)。
),并从中构建最终矩阵(使用sparse
):
当然,要计算sum((M*x)。*x)
full(sum(R))
full(sum(R))