matlab - Matlab/Octave 中的两个求和计算中哪一个对于行向量是最佳的?

标签 matlab vector octave vectorization matrix-multiplication

我对 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/

相关文章:

MATLAB - 将向量转换为单位向量

arrays - 在不使用 MATLAB 循环的情况下通过元胞数组的一维连接子元胞

c++ - 使用迭代器访问存储在 vector 中的类对象的方法。如何?

c++ - 从 TC++PL 书中的练习中定位 vector ctor 中的错误

matlab - 在 MATLAB 中迭代所有整数向量总和为某个值?

matlab - 仅正稀疏信号的 FFT 意外峰值 [OCTAVE 或 MATLAB]

matlab - MATLAB类常量的性能

matlab - 使用 Matlab 计算矩阵的熵

matlab - 生成位矩阵

matlab - 图像处理 : Rotational alignment of an object