如何对一系列值求和,忽略任何 NaN 值?

How to sum a series of values, ignoring any NaN values?

我使用的是 MATLAB 版本 R2015a。

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

选项 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 测试代码。


根据评论更新
@Cris Luengo 对那些有更新版本的人的好建议。不需要工具箱。

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

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

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

您可以按照上述答案中的建议使用内置函数。如果您想了解逻辑并使用循环..您可以按照如下所示进行操作:

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

您可以使用 omitnan 参数

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

请注意,这实际上与 R2006a 之前引入的统计工具箱中的 nansum 函数使用的代码相同,因此我认为兼容性非常好。