例如,我知道如何在matlab中绘制这个简单的函数
% simple demo
function z=myfun(x,y)
z=1./((x+y)^2+y^2+5);
这段代码是我在matlab中绘制图形的方法。
x=-3:3;
y=-3:3;
[X,Y]=meshgrid(x,y);
Z=myfun(X,Y);
surf(X,Y,Z)
但是如果对于某些复杂的功能我不知道如何做到这一点。有一个名为Ackley Function的函数,
function [out]=ackley(in)
% dimension is # of columns of input, x1, x2, ..., xn
n=length(in(1,:));
x=in;
e=exp(1);
out = (20 + e ...
-20*exp(-0.2*sqrt((1/n).*sum(x.^2,2))) ...
-exp((1/n).*sum(cos(2*pi*x),2)));
return
有人可以告诉我该怎么做吗?谢谢。
答案 0 :(得分:1)
这实际上特定于Ackley函数的这个实现:该函数假定您的输入如下所示:
x_1 y_1 (...)
x_2 y_2 (...)
. . (.
. . .
. . .)
其中列数是维度(n=2
,即在我们的例子中仅为x
和y
。该函数独立地作用于每一行,因此您可以同时计算任意数量的点。
使用
创建meshgrid
时
x = -3:3;
y = -3:3;
[X,Y] = meshgrid(x,y);
您将获得两个矩阵X
和Y
,但您无法直接将它们输入ackley()
- 您必须创建一个输入矩阵,如上图所示,其中每行对应一个点。您可以使用冒号运算符:
从X
和Y
中生成列向量,并再次连接它们:
in = [X(:), Y(:)];
现在您的结构正确,可以拨打ackley
:
out = ackley(in);
但输出现在是列向量,而不是矩阵。因此,您必须将reshape
作为矩阵:
Z = reshape(out, size(X));
最后,您可以照常绘制图表:
surf(X, Y, Z);