我正在处理一个包含大量零值的大矩阵。当我将这个矩阵从列表转换为交叉表时,我有更多的零值。我想保留所有的初始值它中的值,并且压缩从matlab添加的所有零值来计算平均值。这是我想要做的一个例子:
X =
0.6000 0.6000 5.0000
0.6000 0.8000 6.0000
0.6000 0.8500 0
0.6000 0.8200 0
0.8000 0.8000 9.0000
0.8000 0.9000 2.0000
列表交叉表
NaN 0.6000 0.8000 0.8200 0.8500 0.9000
0.6000 5.0000 6.0000 0 0 0 Average=(5+6+0+0)/4=2,75
0.8000 0 9.0000 0 0 2.0000 Average=(9+2)/2=5,5
提前致谢
答案 0 :(得分:2)
要计算除零之外的平均值,您可以使用
result = sum(x(:))/nnz(x);
计算除零之外的每一行的平均值:
result = sum(x.')./sum(x.'~=0);
上述解决方案假设应从计算中删除所有零。
答案 1 :(得分:1)
如果您想在不考虑零的情况下找到矩阵的均值,请尝试使用 -
%%// Given matrix
x = [NaN 0.6000 0.8000 0.8200 0.8500 0.9000;
0.6000 5.0000 6.0000 0 0 0;
0.8000 0 9.0000 0 0 2.0000]
x1 = x;
x1(x==0)=NaN;
rowwise_mean_without_zeros = nanmean(x1,2) %%// mean of rows
whole_mean_without_zeros = nanmean(x1(:)) %%// mean of the whole matrix
输出
rowwise_mean_without_zeros =
0.7940
3.8667
3.9333
whole_mean_without_zeros =
2.4882
答案 2 :(得分:0)
以下是一些不应该难以理解的描述。选择符合您需求的那个。
假设您想要获取包含至少1条记录的组合的平均值,我想您需要的信息不仅仅是结果表。
您需要保留一个值的索引,或者您需要在源表中查找它。或者,您也可以使用NaN
值初始化表,并且只有在原始列表中出现组合时才将值放在那里。
另一种方法是将计数添加到原始列表中,每个值发生的频率,然后根据该计算进行计算。