我正在尝试寻找列的平均值,但是我在获取我创建的函数的输出时遇到了问题。我的代码如下,我看不出我犯了什么错误。
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
发布于 2015-01-07 12:14:52
在第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))
发布于 2015-01-07 12:12:28
您的行C_f2(C_f2==0)=NaN;
将把NaNs放入C_f2。然后,您的mean
和std
操作将看到这些NaNs和输出NaNs本身。
要让mean
和std
忽略NaN,您需要使用备用版本nanmean
和nanstd
。
但是,这些都是工具箱的一部分,所以如果您只安装了基本的Matlab,则可能没有它们。
发布于 2015-01-07 12:13:05
不要将其设置为NaN,任何涉及计算而没有额外规则的NaN都会返回NaN。
使用find为列的非零部分建立正确的索引
假设第n列是您的输入
N = n(find(n~=0))
现在进行Mu计算
https://stackoverflow.com/questions/27819113
复制