1. 程式人生 > >matlab:畫二維正態分佈密度函式圖

matlab:畫二維正態分佈密度函式圖

首先,把二維正態分佈密度函式的公式貼這裡

這隻圖好大啊~~

但是上面的那個是多維正態分佈的密度函式的通式,那個n階是對稱正定方陣叫做協方差矩陣,其中的x,pi,u都是向量形式。雖然這個式子很酷,但是用在matlab裡畫圖不太方面,下面換一個

這個公式與上面的等價,只不過把向量和矩陣展開,計算出來。我們可以用這個式子畫圖。

因為二維函式的形式是:z=f(x,y)

所以必須先選擇一些點,然後計算出f(x,y)。這些點分佈在一個平面上,而z則在三維空間。

如何選擇平面上的點陣?

[x,y]=meshgrid(a,b)

meshgrid就是這樣一個生成點陣的函式,這個meshgrid理解起來有點繞,不過舉個例子就馬上能力明白了。下面是matlab裡面的一段截圖:

我們可以看到meshgrid生成了兩個同樣大小的矩陣,第一個矩陣是通過把第一個引數[1:3]順著行的方向複製了4次,4是第二個引數的長度,同樣第二個矩陣是第二個引數順著列的方向複製了三次,3是第一個引數向量的長度。而這個點陣就是:

(1,2)   (2,2)   (3,2)

(1,3)   (2,3)   (3,3)

...

看出什麼意思了吧?就這個意思。

至於這兩個引數到底怎麼選,這樣根據你的正態分佈的均值,儘量使點陣的中心與分佈的均值靠近。

好了,有了平面上的點,就來算這些點對應的函式值。往函式裡套就行,下面是程式碼:

?
function Z=drawGaussian(u,v,x,y)
% u,vector,expactation;v,covariance matrix %x=150:0.5:190;   %y=35:110;       [X,Y]=meshgrid(x,y); DX=v(1,1);     %X的方差 dx=sqrt(DX); DY=v(2,2);     %Y的方差 dy=sqrt(DY); COV=v(1,2);     %X Y的協方差 r=COV/(dx*dy); part1=1/(2*pi*dx*dy*sqrt(1-r^2)); p1=-1/(2*(1-r^2)); px=(X-u(1)).^2./DX; py=(Y-u(2
)).^2./DY; pxy=2*r.*(X-u(1)).*(Y-u(2))./(dx*dy); Z=part1*exp(p1*(px-pxy+py)); mesh(x,y,Z);

  最後一句mesh(x,y,Z) 是畫圖函式,畫出的圖行大概是下面這個樣子: