Matlab / Octave 中的两个总和计算中的哪一个在行向量上是最佳的?

Which of the two sum calculations in Matlab / Octave is optimal on a row vector?

我很喜欢 Matlab/Octave 和机器学习,但到目前为止我了解到您想尽可能避免求和和矢量化的迭代循环。

给定一个行向量,如:x = [ 1,2,3,4,5]

您可以通过以下两种方式计算总和:

虽然我的直觉告诉我内置函数,但第二个选项感觉更多 'vectorized'。

哪个更优化,为什么?两者在性能与内存使用等方面是否存在权衡……?

好的,再挖掘一下:

从性能的角度来看,内置 sum() 更好:

  x = rand(1,100000000); 
  %slowwwww
  t = cputime; x * ones(length(x),1); e= cputime - t; e

  % Faster
  t = cputime; sum(x); e= cputime - t; e

我猜想使用额外的 1 向量也是不必要的内存使用。由于与 sum() 相比没有性能提升,因此非本机方法远不是最优的。

一般来说,sum 似乎更好:分配 "all ones" 向量的 time/memory 开销不值得。
但是,当需要对相同长度的向量进行重复求和时,向量的分配只需进行一次,从而减少了平均开销。

在我的机器上:

"Caching" 全一向量:

N=100;T=500000; x=rand(T,N);
tic;o=ones(N,1);for ii=1:T, x(ii,:)*o;end;toc

Elapsed time is 0.480388 seconds.

同时使用 sum:

tic;for ii=1:T, sum(x(ii,:));end;toc

Elapsed time is 0.488517 seconds.

因此,在重复求和的情况下,使用 "all ones" 向量方法稍微 更快。


如果从 中取出 "all ones" 向量的分配,您最终会得到:

N=100;T=500000; x=rand(T,N);o=ones(N,1);
tic;for ii=1:T, x(ii,:)*o;end;toc 

Elapsed time is 0.477762 seconds.

但同样,您必须在某个时候分配它...