假设A是一个稀疏矩阵,范数(A(i,:))需要很长时间。为什么?能不能做得更好?

4次浏览(最近30天)
我在一个循环中计算范数(A(I,:)),其中A是一个稀疏矩阵。这似乎是一个瓶颈,有什么方法可以执行得更快吗?谢谢你!

接受的答案

约翰D 'Errico
约翰D 'Errico 2020年8月10日
你真的不想用循环来做这样的事情。
>> A = spand (10000,10000,0.001);
>时间>(@()规范((1,:)))
ans =
0.000121650132
>>timeit(@()sqrt(和(A.^2,2)))
ans =
0.000442972132
因此,只计算其中一行的范数的时间,占一次性计算所有行范数总时间的很大一部分。

更多的答案(2)

沃尔特·罗伯森
编辑:沃尔特·罗伯森 8月11日
如果你要重复这样做,那么
%有一次成本
= A。';
%然后
规范(在(:1))
比它快100倍吗
规范((1,:))
对于John的建议A = sprand(10000,10000,0.001);那么A转置的代价和计算A的11行标量的代价大致相同。
...当然,用转置后的版本代替原来的版本可能是可行的,所以在某些情况下没有计算成本,只有更改代码的成本。

詹姆斯Tursa
詹姆斯Tursa 8月9日
编辑:詹姆斯Tursa 8月9日
您最终会需要所有的行吗?例如,在开始时在循环外做一次
n =√sum (a ^ 2, 2))
然后在每次迭代中选取你想要的元素。
或者,您可以在mex例程中逐行执行此计算,以避免显式形成a (i,:)行相关的数据复制。

标签

社区寻宝

在MATLAB中心找到宝藏,并发现社区如何可以帮助你!

开始狩猎!