Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 在matlab中的积密集矩阵*稀疏矩阵中,如何才能只计算特定的条目?_Performance_Matlab_Matrix_Product_Sparse Matrix - Fatal编程技术网

Performance 在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)是非零的。最后,我还将只对每个列计数感兴趣

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

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