我对 Matlab/Octave 和机器学习相当满意,但到目前为止,我了解到您希望尽可能避免求和和矢量化的迭代循环。
给定一个行向量,例如:x = [ 1,2,3,4,5]
您可以使用这两种方法计算总和:
总和(x)
x * 个(长度(x),1)
虽然我的直觉告诉我内置函数,但第二个选项感觉更“矢量化”。
哪一个更优化,为什么?两者之间在性能与内存使用等方面是否存在权衡?
最佳答案
总的来说,似乎 sum
更好:分配“全一”向量的时间/内存开销不值得。
但是,当需要对相同长度的向量进行重复求和时,只需分配一次向量即可,从而减少了平均开销。
在我的机器上:
“缓存”所有向量:
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.
因此,在重复求和的情况下,使用“全一”向量方法稍微更快。
如果将“全一”向量的分配从time calculation中取出,你最终会得到:
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 - Matlab/Octave 中的两个求和计算中哪一个对于行向量是最佳的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36255838/