2017-07-09 17 views
3

我正在使用Matlab 2016a;我试图在第三维方向去趋势化三维数组,但是在那里有缺失的值。由于位置与地理位置相关,所以值保持在阵列中的相同位置是非常重要的。 3-d array忽视NaN时,三维阵列

在这张图片中,假设第2页的NaN位于随机位置,但第1页和第3页有完整的数据。沿着第三维方向,一些向量将有三个数据点,一些将有两个。我需要能够使用所有可用的值沿第三维去趋势。如果我要查看detrended第1页或第3页的值,则不应该有缺失值(因为始终使用2个或3个数据点),但是第2页将在NaN占位符处NaN位于。

我的问题是:我怎么能在忽略NaN的情况下沿着第三维趋势?

我试过使用detrend3(在Matlab文件交换器上找到:https://www.mathworks.com/matlabcentral/fileexchange/61328-detrend3?focused=7203929&tab=function),它可以在消除缺失值的三维数组时发挥作用。

与NaN呈现的折痕会产生错误。我试图忽略NaN,并将NaN设置为-9999,然后忽略这个数字,但一直无法获得这些努力。

任何指导要走什么方向将不胜感激。

+0

它不清楚我到底去趋势你想要什么表演?然而,你可以在detrend3函数中改变这一行:t =(t(:) - mean(t))/ std(t);对t =(t(:) - nanmean(t))/ nanstd(t);'忽略NaNs? – Justin

+0

@Justin,据我所知,这是行不通的。 NaN位于'A'矩阵中,而不是't'向量。 – MrAzzaman

+0

你能确切地证实你想要达到什么样的消极情绪吗? – Justin

回答

1
function detrended = detrendNaN3(A,t) 
%DETRENDNAN3 Detrends a matrix with NaNs into the third dimension 
% Input Arguments: 
%  - A: NxMxK matrix 
%  - t: 1xK time vector 

% time to same format as A 
t = bsxfun(@times,permute(t,[3 1 2]),ones(size(A))); 
% where A == Nan, -> t = NaN 
t(isnan(A)) = NaN; 
%mean of time each pixel 
xm = nanmean(t,3); 
% mean of every pixel in A 
ym = nanmean(A,3); 
% calculate slope using least squares for every pixel 
a = nansum(bsxfun(@times,bsxfun(@minus,t,xm),bsxfun(@minus,A,ym)),3)./nansum(bsxfun(@minus,t,xm).^2,3); 
% calculate intercept for every pixel 
b = ym - a.*xm; 
% calculate trend for every pixel 
trend = bsxfun(@plus,b,bsxfun(@times,a,t)); 
% remove trend 
detrended = A-trend; 
end 

即使强悍的功能是完全矢量化也可以写快一点 - 但它是目前非常可读,并用2500x1700x100矩阵它需要大约8秒钟,我认为可以接受。

的更新版本保持at the file exchange.