如何对一系列值求和,忽略任何 NaN 值?
How to sum a series of values, ignoring any NaN values?
我使用的是 MATLAB 版本 R2015a。
我通过多次求解最优问题得到了一个系列答案,我想得到它们的总和并求平均。但是,其中一些是 NaN。我如何编写代码来忽略那些 NaN 并对其他非 NaN 求和?
选项 1: 工具箱免费解决方案,使用基础 MATLAB 中的 sum
和 isnan
。
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
函数使用的代码相同,因此我认为兼容性非常好。
我使用的是 MATLAB 版本 R2015a。
我通过多次求解最优问题得到了一个系列答案,我想得到它们的总和并求平均。但是,其中一些是 NaN。我如何编写代码来忽略那些 NaN 并对其他非 NaN 求和?
选项 1: 工具箱免费解决方案,使用基础 MATLAB 中的 sum
和 isnan
。
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
函数使用的代码相同,因此我认为兼容性非常好。