在matlab函数中处理NaN

时间:2013-02-04 18:55:58

标签: r matlab function matrix nan

我想知道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)。

此外,我无法访问统计工具箱,因此无法使用nanmean()之类的内容。

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

从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,对于包含NaN s的列/行,它将返回NaN

mediancovminmaxsumvarstd也支持忽略{{ 1}} S上。

答案 2 :(得分:2)

我认为这应该有效:

mean(x(isfinite(x)));

答案 3 :(得分:2)

Matrices怎么样?

正如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