在 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
,它将为包含NaN
s 的列/行返回NaN
。
median
、cov
、min
、max
、sum
、var
和std
也支持忽略NaN
s。
【讨论】:
【参考方案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的主要内容,如果未能解决你的问题,请参考以下文章