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]
您可以通过以下两种方式计算总和:
sum(x)
x * ones(length(x),1)
虽然我的直觉告诉我内置函数,但第二个选项感觉更多 '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.
但同样,您必须在某个时候分配它...
我很喜欢 Matlab/Octave 和机器学习,但到目前为止我了解到您想尽可能避免求和和矢量化的迭代循环。
给定一个行向量,如:x = [ 1,2,3,4,5]
您可以通过以下两种方式计算总和:
sum(x)
x * ones(length(x),1)
虽然我的直觉告诉我内置函数,但第二个选项感觉更多 '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" 向量方法稍微 更快。
如果从
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.
但同样,您必须在某个时候分配它...