首先,把二維常態分佈密度函數的公式貼這裡
這隻圖好大啊~~
但是上面的那個是多維常態分佈的密度函數的通式,那個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) 是畫圖函數,畫出的圖行大概是下面這個樣子: