我试图找到列的意思,但是我无法获得我创建的函数的输出。我的代码在下面,我看不出我犯了什么错误。
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 :(得分: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。然后,您的mean
和std
操作将会看到这些NaN并自行输出NaN。
要让mean
和std
忽略NaN,您需要使用备用版本nanmean
和nanstd
。
然而,这些是工具箱的一部分,所以如果您只是安装了基础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);