【问题标题】:How to compute average value of element bigger than zero in matrix如何计算矩阵中大于零的元素的平均值
【发布时间】:2019-07-06 14:29:28
【问题描述】:

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

G =

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

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

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

matlab代码怎么做?

【问题讨论】:

  • 重要问题:这个矩阵是只包含整数,还是包含浮点数?

标签: matlab matrix


【解决方案1】:

对于一个相当简单的解决方案,如果您有统计工具箱,只需将所有零和负值替换为 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?

【讨论】:

  • 感谢 rayryeng。我的矩阵包含浮点数。不过,别担心。我可以使用阈值来过滤它。所以小于阈值的元素将为零。
  • @user8264 - 好的,看起来你已经准备好了!祝你好运!
  • 两种方法都不错,这里的注释也很相关
  • @LuisMendo - Graçias :)
  • @Kamtal - 谢谢!...虽然它确实需要使用统计工具箱,所以使用第二种方法更具可重复性。此外,如果您只搜索严格大于 0 的所有条目,并计算其中有多少来计算平均值,则可以简化它......说到这里,我发现了一个错误。我会更新我的帖子!
【解决方案2】:

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

请注意,这种方法对于只包含零(或负值)的列可能会失败

【讨论】:

    【解决方案3】:

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

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

    如果你的其他数字都是正数,你可以直接做类似的事情

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

    【讨论】:

    • 我尝试了第二个建议。它没有提供所需的输出。
    • 您的矩阵中有负值​​吗?如果这样做,您的均值将是错误的,因为 G>0 不会计算这些单元格,或者您可以尝试 G~=0 而不是 G>0;哦,对不起,没有正确阅读,您要求每列的平均值!最快的方法是 sum(G, 1)./sum(G~=0, 1),1 表示按列求和,如果要行,则为 2。
    • 我尝试了 OP 建议的输入,我希望得到预期的结果。
    • 它不起作用,因为您忘记了 dot (.) 运算符。您正在做的是尝试使用rdivide 找到线性方程组的解。您可能打算这样做:sum(G)./size(G(find(G&gt;0)),1)。顺便说一句,您还应该将 mean 重命名为 mean 是 MATLAB 中的实际函数。您会无意中覆盖该函数,因此如果您稍后尝试使用实际函数mean,它将无法工作,因为它现在是一个变量。您对 kkuilla 的评论是正确的,但在您的实际答案中并没有固定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-13
    • 1970-01-01
    • 2021-06-16
    • 2013-01-04
    • 2014-01-21
    相关资源
    最近更新 更多