列的平均值和标准偏差,忽略零值 - Matlab

时间:2015-01-07 12:03:19

标签: matlab mean standard-deviation

我试图找到列的意思,但是我无法获得我创建的函数的输出。我的代码在下面,我看不出我犯了什么错误。

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

4 个答案:

答案 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

或者它可能是最简单的,如果你直接排除所有零的元素而不是用NaN替换它们。

mean(a(a~=0))

答案 1 :(得分:0)

您的行C_f2(C_f2==0)=NaN;会将NaN放入C_f2。然后,您的meanstd操作将会看到这些NaN并自行输出NaN。

要让meanstd忽略NaN,您需要使用备用版本nanmeannanstd

然而,这些是工具箱的一部分,所以如果您只是安装了基础Matlab,则可能没有它们。

答案 2 :(得分:0)

不要将其设置为NaN,任何没有附加规则的NaN计算将返回NaN,

使用find来正确索引列的非零部分

说列n是你的输入

N = n(find(n~=0))

现在进行你的Mu计算

答案 3 :(得分: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 是值的数量)。如果你想要"未经修正的"版本(即除以 n ):

std_nz = sqrt(mean2_nz-mean_nz.^2);