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

Matlab 如何计算矩阵中大于零的元素的平均值,matlab,matrix,Matlab,Matrix,我想计算矩阵中大于零的每列元素的平均值,定义为: G = 1 2 3 0 9 4 0 1 3 4 0 0 如果元素是ZeRo,我们将忽略它,而不考虑平均值。我的预期结果是 MeanG= 1/1 3/2 6/2 4/1 9/1 4/1 如何通过matlab代码实现这一点?对于一个相当简单的解决方案,如果您有统计工具箱,只需将所有零和负值替换为NaN,然后使用 因此: >>

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

G =

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

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

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

如何通过matlab代码实现这一点?

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

因此:

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

out =

    1.0000    1.5000    3.0000    4.0000    9.0000    4.0000
这里的复杂之处在于,我们搜索那些为零或为负的元素,然后复制
G
,并将此副本中的这些元素设置为零,这样这些条目就不会被添加到总和中。您必须通过除以零或负(或仅为正)的条目总数来说明正确的平均值

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

小调
朱伯斯说得很好。如果这个矩阵包含浮点数,由于精度和准确性,与像0这样的定数进行比较是非常危险的。例如,如果这是一个矩阵,其中有一些元素希望为零,但它们不是由于浮点不精确造成的,那么这将无法准确计算所需的平均值。请看这篇文章和@gnovice的这篇精彩回答,了解更多详细信息:

没有工具箱依赖关系的默认解决方案可能是:

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

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

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

重要问题:这个矩阵是只包含整数,还是包含浮点数?我尝试了第二个建议。它没有给出所需的输出。你的矩阵中有负值吗?如果有,你的平均值将是错误的,因为G>0不会计算这些单元格,或者你可以尝试G~=0而不是G>0;哦,对不起,没有阅读properly,您要求每列的平均值!最快的方法是sum(G,1)。/sum(G~=0,1),1表示按列进行运算求和,如果需要行,则为2。我尝试了OP建议的输入,我期望得到预期的结果。它不起作用,因为您忘记了
点(
)运算符。您正在尝试使用
rdivide
来找到线性方程组的解。您可能打算这样做:
sum(G)。/size(G(find(G>0)),1)
。顺便说一句,您还应该重命名
mean
,因为
mean
在MATLAB中是一个实际函数。您会无意中对该函数进行阴影处理,因此如果您稍后尝试使用实际函数
mean
,它将无法工作,因为它现在是一个变量。您在对kkuilla的注释中有它,但它在您的实际操作中没有固定我回答。谢谢rayryeng。我的矩阵包含浮点。但是,别担心。我可以使用阈值来过滤它。因此小于阈值的元素将为零。@user8264-好的,那么看起来你已经设置好了!祝你好运!这两种方法都很好,注释也非常相关here@LuisMendo-格拉西亚斯:)@Kamtal-谢谢!。。。不过,它确实需要使用统计工具箱,因此使用第二种方法更具可重复性。此外,如果您只搜索严格大于0的所有条目,并计算其中有多少条用于计算平均值,则可以简化此过程。。。说到这里,我发现了一个错误。我会更新我的帖子!
z = size(A(find(A<0)))
mean = sum(G)./size(G(find(G>0)),1)