fsurf和ezsurf之间的区别 - MATLAB错误报告
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了fsurf和ezsurf之间的区别 - MATLAB错误报告相关的知识,希望对你有一定的参考价值。
我有fsurf命令的问题:
我用的时候
fsurf(@(x,y) ackleyfcn([x,y]),[-32 32 -32 32])
我收到了这个警告:
警告:函数在数组输入上出现意外行为。要提高性能,请正确地向量化函数以返回与输入参数具有相同大小和形状的输出。
这张照片(经过很长一段时间,大约20秒):
我用的时候
ezsurf(@(x,y) ackleyfcn([x,y]),[-32 32 -32 32])
我没有得到任何警告和正确(快速)的图片:
哪里:
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版本。
答案
该函数必须接受两个矩阵输入参数并返回相同大小的矩阵输出参数。
您假设输入是列向量。
要解决此问题,您可以尝试
function z = ackleyfcn(x,y)
xx = [x(:),y(:)];
% ... your code here
z = reshape(z,size(x));
和
fsurf(@ackleyfcn,[-32 32 -32 32])
另一答案
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函数。
以上是关于fsurf和ezsurf之间的区别 - MATLAB错误报告的主要内容,如果未能解决你的问题,请参考以下文章