【问题标题】:How to sum a series of values, ignoring any NaN values?如何对一系列值求和,忽略任何 NaN 值?
【发布时间】:2019-08-16 08:07:19
【问题描述】:

我使用的是 MATLAB R2015a 版本。

我多次解决最优问题得到了一系列答案,我想得到它们的总和并对它们进行平均。但是,其中一些是 NaN。如何编写代码来忽略那些 NaN 并将其他非 NaN 相加?

【问题讨论】:

  • 你试过什么?你听说过rmmissingisnan吗?
  • 我试过for循环来求和,或者直接使用求和指令
  • @CrisLuengo, that post 肯定是相关的,尽管我觉得这组答案现在更具体和更新了。
  • @SecretAgentMan:我投票决定以重复的形式结束,因为该问题的答案与他的相同(nansumsum+isnan),尽管问题并不相同。这个问题更通用,另一个相当具体,单元阵列使问题复杂化。如果投票过时(这似乎很可能),至少现在问题之间存在联系,它将帮助人们找到答案。

标签: matlab sum average nan


【解决方案1】:

选项 1: 使用基本 MATLAB 中的 sumisnan 的工具箱免费解决方案。

A = [1 2 3 4 5 6 7 8 9 NaN];
sum(A(~isnan(A)))               % No toolbox required

选项 2: nansum(请参阅来自 OP 的 answer) 注意:nansum 需要统计工具箱。

nansum(A)                       % Requires Statistics toolbox

使用 MATLAB R2018b 测试的代码。


来自 cmets 的更新
@Cris Luengo 为那些拥有更新版本的人提供了很好的建议。不需要工具箱。

sum(A,'omitnan')                % No toolbox required

@Ben Voigt 对某些应用程序的另一个建议。也不需要工具箱。

sum(A(isfinite(A)))             % No toolbox required

【讨论】:

  • 在较新版本的 MATLAB 中,您也可以使用 sum(A,'omitnan')
  • ~isnan(A) 更好的可能是isfinite(A),这取决于应该如何处理其他特殊值。
  • 很好的建议。将更新答案以包含您的注释和出处。
【解决方案2】:

您可以使用上述答案中建议的内置函数。如果你想知道逻辑并使用循环..你可以按照如下所示:

A = [NaN 1 2 NaN 3 4 7 -1 NaN] ; 
count = 0 ;
thesum = 0 ; 
for i = 1:length(A)
    if ~isnan(A(i))
        count = count+1 ;
        thesum = thesum+A(i) ;
    end
end

【讨论】:

  • 除了这个和sum(A(~isnan(A)))一样,我不明白count这个变量的意义是什么?
  • 对于未来的读者:请注意,这可能是此页面上效率最低的解决方案。 MATLAB 针对向量运算进行了优化。循环有助于促进理解,但在此听取其他人提出的更简洁解决方案的建议是一种很好的做法。
  • @Wolfie,感谢您一直关注我。我想我的意思是在不循环的情况下获得count 的方法是count = sum(~isnan(A))
  • @Wolfie 我同意你的看法……我的目的是展示循环来学习东西。 :)
【解决方案3】:

您可以使用omitnan 参数

A = [1 2 3 4 5 6 7 8 9 NaN];
s = sum( A, 'omitnan' )

请注意,这与统计工具箱中的 nansum 函数使用的代码完全相同,后者是在 R2006a 之前引入的,所以我认为兼容性很好。

【讨论】:

  • 什么时候推出的?我不记得了,但我认为是在 R2015a 之后? (OP 指定此版本)
  • 刚刚根据@CrisLuengo 的评论更新了我的答案,然后在这里看到了你的答案。我的错。我应该删除我的答案的那部分还是留下它@Wolfie?
  • @Cris 我无权访问该文档,也许可以挖掘更改说明,或者在您选择的版本中使用doc sum 来查看它是否存在。正如我所说,它实际上与nansum 的代码相同(请参阅edit nansum),但我不知道它是否一直如此。
  • 他们会重写nansum 以使用新功能是有道理的。它可能会加快速度。核心功能更有可能在编译语言中实现,工具箱功能更有可能在 M 文件中实现(尽管并非总是如此)。
猜你喜欢
  • 2020-10-08
  • 1970-01-01
  • 1970-01-01
  • 2019-09-24
  • 1970-01-01
  • 1970-01-01
  • 2015-02-10
  • 2018-07-05
  • 2016-03-28
相关资源
最近更新 更多