2014-12-05 104 views
2

我要计算在每一列中的元素的平均值大于零的平均值,该值大于零的矩阵,该矩阵定义为:如何计算元件在矩阵

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代码实现?

+1

重要的问题:这是否矩阵只包含整数,还是它包含浮点数? – Jubobs 2014-12-05 16:02:48

回答

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?

+0

感谢rayryeng。我的矩阵包含浮点。但是,别担心。我可以使用阈值来过滤它。因此小于阈值的元素将为零。 – user8264 2014-12-05 17:50:32

+0

@ user8264 - 好的,那么看起来你就是这样设置的!祝你好运! – rayryeng 2014-12-05 17:51:59

+0

不错的做法,并注意这里也非常相关 – 2014-12-05 18:27:21

3

没有工具箱依赖默认的解决方案可能会阅读:

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列数组的正确维数,还应该指定维数。

请注意,这种做法可能失败的列,其中只包含零(或负值)

1

有很多方法可以做到这一点,你可以找到零的数量在你的矩阵,你当删除在计算平均

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

如果你的其他数字都是积极的,你可以直接这样做

mean = sum(G)./size(G(find(G>0)),1) 
+0

我尝试了第二个建议。它不会提供所需的输出。 – kkuilla 2014-12-05 16:12:55

+0

您的Matrix中是否有负值?如果你这样做,你的意思是错误的,因为G> 0不会计算这些单元格,或者你可以尝试G〜= 0而不是G> 0;哦,对不起,没有正确阅读,你问每个专栏的意思!最快的方法是sum(G,1)./ sum(G〜= 0,1),1表示按列操作和,如果你想要行,它的2. – GameOfThrows 2014-12-05 16:16:31

+0

我试着用OP建议的输入和我期待预期的结果。 – kkuilla 2014-12-05 16:17:53