我想计算每列中大于零的元素的平均值,矩阵定义为:
G =
1 2 3 0 9 4
0 1 3 4 0 0
Run Code Online (Sandbox Code Playgroud)
如果一个元素是零,我们将忽略它并且不考虑平均值.我的预期结果是
MeanG= 1/1 3/2 6/2 4/1 9/1 4/1
Run Code Online (Sandbox Code Playgroud)
怎么用matlab代码呢?
对于一个相当简单的解决方案,如果您有统计工具箱,只需替换所有零和负值,NaN
然后使用nanmean
.
因此:
>> Gnan = G;
>> Gnan(Gnan <= 0) = NaN;
>> out = nanmean(Gnan)
out =
1.0000 1.5000 3.0000 4.0000 9.0000 4.0000
Run Code Online (Sandbox Code Playgroud)
我制作了一份副本,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
Run Code Online (Sandbox Code Playgroud)
这里的复杂性是我们搜索那些零或负的元素,然后复制G
并将此副本中的这些元素设置为零,这样这些条目就不会被添加到总和中.你必须通过是项的总数除以占正确的平均值不为零或负(或只是积极的实际... 看到中Nras的职位).
请注意,我还会保留G
此副本的副本并对其进行更改以计算我们的平均值,因为我假设您要保留原始版本以G
进行进一步分析.
Jubobs提出了一个非常好的观点.如果该矩阵包含浮点数,由于精度和准确性,与诸如0的确定数字进行比较是非常危险的.例如,如果这是一个矩阵,其中有一些元素,你期望它们为零,但它们不是由于浮点不精确,那么这将无法准确计算出你想要的平均值.看一下这篇文章和@gnovice的这个好答案了解更多细节:为什么24.0000在MATLAB中不等于24.0000?