我想知道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()
.
你可以做类似的事情mean(x(~isnan(x)))
。如果你愿意,你也可以像这样编写一堆包装器并将它们放在你的 startup.m 文件中。
从 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
包含NaN
s 的列/行。
median
, cov
, min
, max
, sum
,var
也std
支持忽略NaN
s。
我认为这应该有效:
mean(x(isfinite(x)));
正如 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