Re: [問題] 矩陣求histogram已回收

看板MATLAB作者 (築夢踏實)時間13年前 (2010/10/09 16:24), 編輯推噓1(101)
留言2則, 2人參與, 最新討論串3/3 (看更多)
※ 引述《kuroroTW (kuroro...)》之銘言: 恕刪 : 我有一個 matrix 裡面的元素都介於 -180~180 : matrix 大小是 400*500 : 所以有 200000 個 元素 且元素值介於 -180~180 : 我現在要畫 histogram : 橫坐標是 -180~180 (代表元素的值) : 縱座標是 0~1 (每個元素出現的機率(出現的次數/200000)) 縱座標就是機率密度 : 簡單的說話出來的曲線或者直方圖下所包圍的面積為1 恕刪 : 雖然這可能不是一個很困難的問題 以長條圖來表示出現機率(次數)應是一個常見的應用 如何將histogram畫的清楚適當亦是一個重要的課題 首先根據原po敘述 原始資料為一400x500之矩陣 其中各值皆介於-180~180之間 為求測試結果較為明顯 在此使用常態隨機變數 因此可能測試資料會超過範圍 取常態之平均值為0且標準差為60 正負三倍標準差±180以內約佔全部資料之99.7% mua=0;stda=60; A=normrnd(mua,stda,400,500); %原始資料 接著需要決定次數圖之基底 這關係到長條圖之解析度 亦可直接使用原始資料之基底 例如都是整數 在此以每1為一間隔取-180~180 xmin=-180;xmax=180;xacc=1; xx=xmin:xacc:xmax; % eq1 再來即可以此基底利用hist計算各基底之次數 原po要求需以機率表示 因此除以總次數 yy=hist(A(:),xx)/length(A(:)); % eq2 其中A(:)即為reshape(A,[],1) 因使用常態隨機為測試資料 會有超過正負180之值 所以將測試過程作一些調整 xx1=xmin-1:xacc:xmax+1; % eq1' yy1=hist(A(:),xx1)/length(A(:)); % eq2' xx=xx1(2:length(xx1)-1); yy=yy1(2:length(yy1)-1); 如此即可繪製長條圖 bar(xx,yy); xlabel('XXX'); %自行填入 ylabel('YYY'); 調整X軸之範圍 在規定範圍內再多半格 xlim([xmin-0.5*xacc xmax+0.5*xacc]); 如此即可繪成原po所需之histogram 繪製常態分佈機率密度曲線 hold on; plot(xx,normpdf(xx,mua,stda),'r'); % i'm not sure if it is correct hold off; 長條圖之分佈與紅色曲線很接近 與本測試資料預期為常態分佈相符 測試長條圖底下之面積 sum(yy) % eq3 結果稍小於1 其因為此有小部份超過預設之範圍 sum(yy1) 此結果即為1 試計算原始資料未超過範圍之資料數量(比率) length(find(abs(A(:))<=180))/length(A(:)) length(find(abs(A(:))<181))/length(A(:)) 此二結果皆與eq3之結果稍有不同 length(find(abs(A(:))<180.5))/length(A(:)) 此結果即與eq3相同 亦與正負三倍標準差約佔總數量之99.7%很接近 normcdf(xmax,mua,stda)-normcdf(xmin,mua,stda) 最後 儲存畫好的長條圖 pring('-depsc', 'hist1.eps'); 或是儲存長條圖資料(依各人需求不同自行調整) tmp=[xx' yy']; save('hist1.eps', 'tmp', '-ascii'); 總結:原po可參考hist bar length sum reshape等document 如本篇內容有錯誤煩請不吝賜教 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.117.165.163 ※ 編輯: iccfish 來自: 140.117.165.163 (10/09 16:33)

10/09 19:40, , 1F
對啊 A(:)就解決啦XD
10/09 19:40, 1F

10/09 23:31, , 2F
謝謝大大指導 ^^
10/09 23:31, 2F
文章代碼(AID): #1Ci2Qe6K (MATLAB)
文章代碼(AID): #1Ci2Qe6K (MATLAB)