在 matlab 函数中处理 NaN

Posted

技术标签:

【中文标题】在 matlab 函数中处理 NaN【英文标题】:Dealing with NaN's in matlab functions 【发布时间】:2013-01-19 13:17:21 【问题描述】:

我想知道 matlab 是否有内置方法来处理函数调用中的NaN。更具体地说,我试图取其中包含 NaN 的向量的平均值。例如,在 R

> x = c(1,2,3,4,NA)
> mean(x)
[1] NA
> mean(x,na.rm=TRUE)
[1] 2.5

在 Matlab 中是否有与此类似的东西在一行中(我不想编写自己的函数,也不想在计算平均值之前循环查找 NaN's)。

另外,我无权访问统计工具箱,因此无法使用 nanmean() 之类的东西。

【问题讨论】:

【参考方案1】:

您可以执行mean(x(~isnan(x))) 之类的操作。如果你愿意,你也可以像这样编写一堆包装器并将它们放在你的 startup.m 文件中。

【讨论】:

【参考方案2】:

截至 MATLAB 2015a,mean supports an extra parameter, nanflag。使用 JoErNanO 的答案中的示例,

A = [1 0 NaN; 0 3 4; 0 NaN 2];
mean(A, 'omitnan')
% = [0.333333333333333 1.5 3]

该参数的默认值为includenan,它将为包含NaNs 的列/行返回NaN

mediancovminmaxsumvarstd也支持忽略NaNs。

【讨论】:

【参考方案3】:

我认为这应该可行:

mean(x(isfinite(x)));

【讨论】:

【参考方案4】:

矩阵呢?

正如 Karthik V 所建议的,

mean(x(~isnan(x)))

适用于向量。但是,如果您有一个 n×m 矩阵并希望计算行/列平均丢弃偶尔的 NaN,则必须运行 for 循环。

示例场景

想象一个表格的数据矩阵:

A = [1 0 NaN; 0 3 4; 0 NaN 2]

A =
 1     0   NaN
 0     3     4
 0   NaN     2

运行mean(A(~isnan(A))) 产生:

ans =

1.4286

这是因为逻辑索引有效地将矩阵“展平”为向量。

循环解(按列均值)

假设您要计算列均值,则循环解决方案变为:

% Preallocate resulting mean vector
nCols = size(A, 2);
mu = zeros(1, nCols);

% Compute means
for col = 1:nCols
    mu(col) = mean(A(~isnan(A(:, col)), col));
end

导致:

mu =

0.3333    1.5000    3.0000

循环解(行均值)

假设您要计算逐行均值,则循环解决方案变为:

% Preallocate resulting mean vector
nRows = size(A, 1);
mu = zeros(nRows, 1);

% Compute means
for row = 1:nRows
    mu(row) = mean(A(row, ~isnan(A(row, :))));
end

导致:

mu =

0.5000
2.3333
1.0000

【讨论】:

以上是关于在 matlab 函数中处理 NaN的主要内容,如果未能解决你的问题,请参考以下文章

在matlab中NAN是啥意思?

matlab循环次数过多出现NAN?

matlab 如何用插值给NAN赋值

matlab corr2函数为啥返回NaN值?

关于matlab中nan读取的问题

matlab:如果 x > 1 则可以产生 NaN 的快速函数