我想知道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()
之类的内容。
答案 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
。
median
,cov
,min
,max
,sum
,var
和std
也支持忽略{{ 1}} S上。
答案 2 :(得分:2)
我认为这应该有效:
mean(x(isfinite(x)));
答案 3 :(得分: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