Loren在Matlab的艺术上

将想法转化为matlab

最近关于Subarray计算速度的问题

最近有人要求我解释使用循环和数组索引与放置子阵列进行计算的速度行为。

内容

例子

假设我有两个输入的函数,第一个输入是列(一个方形阵列),第二,标量和输出,向量。

myfun = @(x,z)x'* x + z;

即使这可以以完全矢量化的方式计算,让我们探索从阵列输入的子阵列工作时会发生什么。

我现在正在创建输入数组X结果输出阵列进行两种方式,其中一个方法中的额外中间步骤。

n = 500;x = randn(n,n);结果1 =零(n,1);结果2.零(n,1);

第一个方法

在这里,我们看到并时间了第一个方法。在此,我们创建了临时数组x(:,k)N.穿过外环的时间。

t为了k = 1:n为了z = 1:n结果1(z)= myfun(x(:,k),z);结尾结果1 =结果1 + x(:,k);结尾运行时(1)= TOC;

第二种方法

在此方法中,我们首先在外循环中提取感兴趣的列,并通过内循环每次重复使用该临时数组。我们再次看到和时间结果。

t为了k = 1:n xt = x(:,k);为了z = 1:n结果2(z)= myfun(xt,z);结尾结果2 =结果2. + x(:,k);结尾运行时(2)= TOC;

结果相同?

首先,让我们确保两种方式得到同样的答案。你可以看到我们这样做。

thesame = isequal(结果1,结果2)
thesame = 1

比较运行时

接下来,让我们比较时间。我想提醒您,从脚本中执行时间通常具有比在函数内运行相同的代码时的开销更多。我们只想看到相对行为,所以我们应该从这项运动中获得一些洞察力。

DISP(['运行时间是:',num2str(运行时)])
运行时间是:2.3936 1.9558

发生了什么?

这是发生的事情。在第一种方法中,我们创建了一个临时变量N.通过外部循环的时间,即使该阵列是固定列的常量。在第二种方法中,我们提取了一次相关列,并重用它N.穿过内圈的时间。

如果你一起玩这个问题,请保持周到。根据函数的细节,如果您每次执行的计算与提取列向量的时间很大,则可能看不到两种方法之间的差异很大。但是,如果计算持续时间足够短,则临时变量的重复创建可能会在计算中添加大量的开销。一般来说,你不应该越来越糟糕,始终捕获临时阵列可能是最少的次数。

你的结果?

在分析你的算法之一时,你有没有注意到类似的时间“谜题”?我很想听到更多这里




与MATLAB®R2013A发布

|

注释

要发表评论,请点击这里要登录您的MathWorks帐户或创建新的。