Matlab忽略矩阵中的NaN
Posted
技术标签:
【中文标题】Matlab忽略矩阵中的NaN【英文标题】:Matlab disregarding NaN's in matrix 【发布时间】:2011-09-24 02:54:09 【问题描述】:我有一个包含时间序列的双精度矩阵 (X
)。当存在缺失值时,一些观察值设置为NaN
。我想计算每列的标准偏差以获得每列的标准偏差值。由于我混入了 NaN,因此简单的 std(X)
将不起作用,如果我尝试 std(X(~isnan(X))
,我最终会得到整个矩阵的 std dev,而不是每列一个。
有没有一种方法可以在不使用循环的情况下从标准开发计算中简单地忽略 NaN?
请注意,在 NaN 的情况下,我只想忽略单个值,而不是整个行或列。显然我不能将 NaN 设置为零或任何其他值,因为这会影响计算。
【问题讨论】:
【参考方案1】:看看nanstd
(统计工具箱)。
想法是使用nanmean
将数据居中,然后将NaN 替换为零,最后计算标准差。
请参阅下面的nanmean
。
% maximum admissible fraction of missing values
max_miss = 0.6;
[m,n] = size(x);
% replace NaNs with zeros.
inan = find(isnan(x));
x(inan) = zeros(size(inan));
% determine number of available observations on each variable
[i,j] = ind2sub([m,n], inan); % subscripts of missing entries
nans = sparse(i,j,1,m,n); % indicator matrix for missing values
nobs = m - sum(nans);
% set nobs to NaN when there are too few entries to form robust average
minobs = m * (1 - max_miss);
k = find(nobs < minobs);
nobs(k) = NaN;
mx = sum(x) ./ nobs;
请参阅下面的nanstd
。
flag = 1; % default: normalize by nobs-1
% center data
xc = x - repmat(mx, m, 1);
% replace NaNs with zeros in centered data matrix
xc(inan) = zeros(size(inan));
% standard deviation
sx = sqrt(sum(conj(xc).*xc) ./ (nobs-flag));
【讨论】:
太好了,谢谢。不敢相信我错过了那个功能。当您浏览 std 的帮助时,希望 Matlab 链接到 nanstd :-)。再次感谢一百万。以上是关于Matlab忽略矩阵中的NaN的主要内容,如果未能解决你的问题,请参考以下文章