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

时间:2018-03-02 17:43:04

标签: matlab plot vectorization

我遇到 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 版本。

2 个答案:

答案 0 :(得分:0)

来自documentation

  

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

您假设输入是列向量。

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

val microphonePluggedReceiver = MicrophonePluggedInReceiver()

// ...

context.registerReceiver(microphonePluggedReceiver, IntentFilter(Intent.ACTION_HEADSET_PLUG))    

// ...

unregisterReceiver(microphonePluggedReceiver)

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

答案 1 :(得分: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 函数。