如何计算矩阵中大于零的元素的平均值

时间:2014-12-05 15:56:50

标签: matlab

我想计算每个列中大于零的元素的平均值,矩阵定义为:

G =

     1     2     3     0     9     4
     0     1     3     4     0     0

如果元素是zerro,我们将忽略它并且不考虑平均值。我的预期结果是

MeanG= 1/1  3/2  6/2  4/1  9/1 4/1

如何通过matlab代码完成?

3 个答案:

答案 0 :(得分:5)

对于一个相当简单的解决方案,如果你有统计工具箱,只需用NaN替换所有零和负值,然后使用nanmean

因此:

>> Gnan = G;
>> Gnan(Gnan <= 0) = NaN;
>> out = nanmean(Gnan)

out =

    1.0000    1.5000    3.0000    4.0000    9.0000    4.0000

我制作了G的副本,因为我假设您要保留G的原始版本以进行任何进一步的分析,而不是以这种方式计算均值。


如果您无权访问nanmean,您可以查看每个列并确定有多少个零和负数。完成此操作后,只需将每列中零和负数的所有值相加,然后除以零和负值的总数。每一栏。类似的东西:

>> zero_neg = G <= 0;
>> Gcopy = G;
>> Gcopy(zero_neg) = 0;
>> out = sum(Gcopy) ./ (size(G,1) - sum(zero_neg))

out =

    1.0000    1.5000    3.0000    4.0000    9.0000    4.0000

这里的复杂性是我们搜索那些零或负的元素,然后复制G并将此副本中的这些元素设置为零,这样这些条目就不会被添加到总和中。您必须通过除以零或负数(或实际上只是正数... see Nras's post)的条目总数来计算正确的均值。

请注意,我还保留了G的副本,并对此副本进行了变更以计算我们的平均值,因为我假设您要保留G的原始版本以供进一步分析。

次要注意事项

Jubobs提出了一个非常好的观点。如果该矩阵包含浮点数,由于精度和准确性,与诸如0的确定数字进行比较是非常危险的。例如,如果这是一个矩阵,其中有期望为零的元素,但它们不是由于浮点不精确,那么这将无法准确计算出您想要的平均值。看一下这篇文章和@gnovice的这个好答案,了解更多详情:Why is 24.0000 not equal to 24.0000 in MATLAB?

答案 1 :(得分:3)

没有Toolbox-Dependency的默认解决方案可能是:

G(G<0) = 0; % // not needed if G contains only positive numbers as in your example
sum(G, 1)./sum(G~=0, 1)

ans =

1.0000    1.5000    3.0000    4.0000    9.0000    4.0000

我们手动总结但仅除以非零元素的数量。为了总结1列数组的正确维度,还应指定维度。

请注意,对于仅包含零(或负值)

的列,此方法可能会失败

答案 2 :(得分:1)

有很多方法可以做到这一点,您可以在矩阵中找到零的数量,并在计算平均值时将其删除

z = size(A(find(A<0)))

如果您的其他数字都是正数,您可以直接执行类似

的操作
mean = sum(G)./size(G(find(G>0)),1)