假设我有一个定义在 0<= x<= pi, 0<=y, z<=2pi 上的函数。我编写了一个 matlab 代码来全局搜索最大点,步长为 0.01。我还恢复了函数值。代码是(当然函数比 x+y+z 更复杂。这只是一个例子。)
x=0;
y=0;
z=0;
i=1;
Maxdeviation= ComputeDeviationSum(0,0,0,mufT, mufD, mufC);
MaximizingArg= [x, y,z] ;
while x<= pi
y=0;
z=0;
while y<= 2*pi
z=0;
while z<=2 *pi
deviation= x+y+z; % Just an example. The function is more complex.
if deviation> Maxdeviation
MaximizingArg= [x, y,z];
Maxdeviation= deviation;
end
a(i,:)=[x, y,z, deviation];
z=z+0.01;
i=i+1;
end
y=y+0.01;
end
x=x+ 0.01;
end
我发现这真的很慢。在我删除了三行恢复值之后,即删除
i=1;
a(i,:)=[x, y,z, deviation];
i=i+1
这三行代码,速度就快了很多。(我在 20 秒后停止了执行,发现后者比前者多执行了 10 倍的迭代次数。)
我的问题是:为什么停止恢复值后,代码会快得多?如果我想为每个点恢复值,我该怎么做才能让代码更快?
您的问题的评论询问您是否在编辑器中看到有关数组大小在每次循环中增加的警告,因为这会导致这些行变慢。这就是他们所指的:
您可以预先计算出大小
a
并预先分配。使用for
循环可以使这一点更清晰一些,因此我在以下代码中进行了两项更改:进一步说,值得注意的是,存储
x,y,z
在输出数组中可能是多余的,您可以改为预先分配a=NaN(numel(X),numel(Y),numel(Z))
然后将函数值存储为。然后,您可以轻松地根据给定的索引、和a(ix,iy,iz)=deviation;
对结果数组进行索引。x
y
z
相反,如果你不想使用索引,
ix,iy,iz
你可以将循环简化为类似的东西for x = X
并删除分配x = X(ix)