fsurf和ezsurf之间的区别 - MATLAB错误报告

问题描述 投票:0回答:2

我有fsurf命令的问题:

我用的时候

fsurf(@(x,y) ackleyfcn([x,y]),[-32 32 -32 32])

我收到了这个警告:

警告:函数在数组输入上出现意外行为。要提高性能,请正确地向量化函数以返回与输入参数具有相同大小和形状的输出。

这张照片(经过很长一段时间,大约20秒):

fsurf plot

我用的时候

ezsurf(@(x,y) ackleyfcn([x,y]),[-32 32 -32 32])

我没有得到任何警告和正确(快速)的图片:

ezsurf plot

哪里:

function z = ackleyfcn(xx)

% Ackley's function

% Search domain: [-32,32]
% Global minimum: f(x) = 0 | x = (0,...,0)

d = size(xx, 2);
xx = max(-32,min(32,xx));

z = -20*exp(-0.2*sqrt(1/d*sum(xx.^2,2))) - exp(1/d*sum(cos(2*pi*xx),2)) + 20 + exp(1);

end

我认为这个Ackley的功能是正确的矢量化。我对吗?

fsurf的错误是什么以及为什么由它生成的图像很奇怪并且生成时间更长?

提前致谢!

Ps。:我正在使用R2017b版本。

matlab plot vectorization
2个回答
0
投票

来自documentation

该函数必须接受两个矩阵输入参数并返回相同大小的矩阵输出参数。

您假设输入是列向量。

要解决此问题,您可以尝试

function z = ackleyfcn(x,y)
xx = [x(:),y(:)];
% ... your code here
z = reshape(z,size(x));

fsurf(@ackleyfcn,[-32 32 -32 32])

0
投票

MathWorks的支持响应:

我能够重现你遇到的慢下来。 fsurf函数尝试确定要使用的点密度,以便准确描述您传递的函数。由于ackleyfcn具有许多小振荡,因此fsurf决定使用非常密集的网格来显示它。此功能在ezsurf中不可用,这就是为什么这些图看起来如此不同。

fsurf花费的时间也要长得多,因为如果它显示更多的点。如果您想使用fsurf生成类似于ezplot的绘图,可以使用以下代码行关闭AdaptiveMeshDenstity功能:

set(fsurf(@(x,y) ackleyfcn([x,y]),[-32 32 -32 32]),'AdaptiveMeshDensity',0,'MeshDensity',60)

请注意,这将增加fsurf的速度,并将生成类似于ezsurf的绘图。但是,这个新表面使用较少的点,因此不能完全代表ackleyfcn函数。

© www.soinside.com 2019 - 2024. All rights reserved.