isscalar(x)和numel(x)之间的速度差异== 1

时间:2016-06-13 08:21:58

标签: arrays performance matlab matrix

我想知道isscalarnumel命令之间的速度差异是什么。我使用这行代码来确定isscalar确定给定数值数组是否为标量所需的时间。我在MATLAB R2014b上。

isscalar

tic, for x = 1:1e7, isscalar(x); end, toc

numel

tic, for x = 1:1e7, numel(x)==1; end, toc

在我的机器上(i3 3220或3220T CPU),上面的代码大约需要0.3秒,所以除非你有一台很旧的机器,否则不会花费太多时间。在查看数字之前一定要运行代码几次:第一次调用像tic这样的命令时,MATLAB将它加载到内存中,因此如果需要,它需要的时间比实际代码要长。首先加载它。

结果支持isscalar(x),小于0.3秒,numel(x)==1大约0.33秒。这可能很重要(这里没有统计数据),因为重复次数很多(10 ^ 7)。

但是,当我们将x更改为不同的内容时,例如magic(3)(这是一个3×3矩阵),计算需要更长的时间(实际上我将迭代次数减少到10 ^ 4)。我做了:

x = magic(3);
tic, for n = 1:1e7, isscalar(x); end, toc

大约需要0.3秒

tic, for n = 1:1e7, numel(x)==1; end, toc

需要大约0.34秒。

这次差异大致相同。

为什么存在这种差异?我认为这是合乎逻辑的numel需要更长的时间,因为逻辑测试==1已经完成。 isscalarnumel如何运作?我认为他们的算法可能如下工作:获取输入的维度,然后(对于isscalar)确定任何维度是否不等于1(并返回false,否则返回true)或(对于numel)乘以获取元素数量的维度。

您是否了解isscalarnumel的其他速度差异示例?并且这个结果在其他CPU上有所不同(如果您愿意,可以将您的CPU和结果作为注释发布)。

注意:isscalar.mnumel.m中的代码受p-files保护或包含在MEX files中,因此我们无法查看其源算法。

0 个答案:

没有答案