2016-07-13 85 views
0

例如,我知道如何繪製這個簡單的功能在MATLAB情節3D圖形

% 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) 

但是,如果對於一些複雜的功能,我不知道該怎麼做。有一個名爲阿克利功能,

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 

有人可以告訴我該怎麼做嗎?謝謝。

回答

1

這實際上是特定於該實施阿克萊功能:該功能假設,你的輸入如下所示:

x_1 y_1 (...) 
x_2 y_2 (...) 
.  .  (. 
.  .  . 
.  .  .) 

,其中列數是維(n=2,即只有x和在我們的例子中爲y)。該函數獨立作用於每一行,因此您可以同時計算任意數量的點。

當你創建一個meshgrid

x = -3:3; 
y = -3:3; 
[X,Y] = meshgrid(x,y); 

你會得到兩個矩陣XY,但你不能直接給他們進入ackley() - 你必須創建一個輸入矩陣顯示在頂部,每行對應一個點。您可以使用冒號運算:使列向量出來的XY,並再次將它們連接起來:

in = [X(:), Y(:)]; 

現在你有正確的結構,並且可以調用ackley

out = ackley(in); 

但輸出現在是列向量,而不是矩陣。因此,您將不得不reshape它,是一個矩陣:

Z = reshape(out, size(X)); 

最後,您可以繪製圖形和往常一樣:

​​

resulting ackley function

+0

非常感謝你,你的答案是非常明確。欣賞它。 –