我遇到 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 版本。
答案 0 :(得分:0)
该函数必须接受两个矩阵输入参数,并返回相同大小的矩阵输出参数。
您假设输入是列向量。
要解决此问题,您可以尝试
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 函数。