3

我想知道matlab是否有内置的方法来处理NaN函数调用中的's。更具体地说,我试图取其中包含 a 的向量的平均值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().

4

4 回答 4

3

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

于 2013-02-04T19:10:49.620 回答
3

从 MATLAB 2015a 开始,mean支持额外参数nanflag. 使用 JoErNanO 的答案中的示例,

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

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

median, cov, min, max, sum,varstd支持忽略NaNs。

于 2016-04-06T23:06:21.007 回答
2

我认为这应该有效:

mean(x(isfinite(x)));
于 2013-02-04T19:12:36.220 回答
2

矩阵呢?

正如 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
于 2014-10-06T15:22:40.573 回答