2015-01-07 200 views
1

我試圖找到列的平均值,但是我無法獲得我創建的函數的輸出。我的代碼如下,我看不出我犯了什麼錯誤。列的平均值和標準偏差,忽略零值 - Matlab

for j=1:48; 
    C_f2 = V(V(:,3) == j,:); 
    C_f2(C_f2==0)=NaN; 
    m=mean(C_f2(:,4)); 
    s=std(C_f2(:,4)); 
    row=[j,m,s]; 
    s1=[s1;row];  
end 

我檢查了矩陣,C_f2和那是完整的值,所以不應該返回NaN。然而我的矩陣s1的輸出是

1 NaN NaN 
2 NaN NaN 
3 NaN NaN 
. ... ... 
48 NaN NaN 

任何人都可以看到我的問題?幫助,我非常感謝!

矩陣C_f2樣子,

1 185 01 5003 
1 185 02 5009 
. ... .. .... 
1 259 48 5001 
+0

我無法重現該問題與給出的示例代碼和數據。使用[debugger](http://www.mathworks.com/help/matlab/matlab_prog/debugging-process-and-features.html)遍歷代碼,看看循環的每次迭代發生了什麼。 – excaza

回答

0

你行C_f2(C_f2==0)=NaN;將會把NaN的入C_f2。然後,您的meanstd操作將自己查看這些NaN並輸出NaN。

要使meanstd忽略NaN,您需要使用替代版本nanmeannanstd

然而,這些是工具箱的一部分,所以如果你只是安裝了基本的Matlab,你可能不會擁有它們。

0

不要將其設置爲NaN,NaN的任何參與計算,而不附加規則將返回NaN的,

使用找到正確索引你的列

說n列是你輸入

的無零部分
N = n(find(n~=0)) 

現在做你的沐計算

1

在第3行,你設置哪些是零爲NaN的所有值。如果任何元素是NaN,那麼mean函數將返回NaN。如果您想忽略NaN值,則必須使用統計工具箱附帶的nanmean函數。請看下面的例子:

a = [1 NaN 2 3]; 

mean(a) 
ans = 
    NaN 

nanmean(a) 
ans = 
    2 

如果您還沒有統計工具箱,可以排除與邏輯索引NaN的元素

mean(a(~isnan(a))) 
ans = 
    2 

,或者它可能是最簡單的,如果你直接exlude所有元素它們是零而不是用NaN代替它們。

mean(a(a~=0)) 
0

要計算的平均值和各列的標準偏差不包括零:

A = [1 2; 
    3 0; 
    4 5; 
    6 7; 
    0 0]; %// example data 
den = sum(A~=0); %// number of nonzero values in each column 
mean_nz = bsxfun(@rdivide, sum(A), den); 
mean2_nz = bsxfun(@rdivide, sum(A.^2), den); 
std_nz = sqrt(bsxfun(@times, mean2_nz-mean_nz.^2, den./(den-1))); 

爲實施例的結果是

mean_nz = 
    3.5000 4.6667 

std_nz = 
    2.0817 2.5166 

上面使用"corrected" definition of standard deviation(其由劃分n -1,其中n是值的數量)。如果你想要「未修正」版本(即通過ñ)鴻溝:

std_nz = sqrt(mean2_nz-mean_nz.^2); 
相關問題