我正在使用Matlab 2016a;我试图沿着第三维消除三维数组,但是缺少值。由于位置与地理位置相关,因此值保持在阵列中的相同位置是至关重要的。
在此图片中,假设Page 2在随机位置具有NaN,但是Page 1和Page 3具有完整数据。沿着第三维度趋向于一些向量将具有三个数据点而一些将具有两个数据点。我需要能够使用所有可用值沿第三维去除趋势。如果我要查看去趋势的第1页或第3页的值,则应该没有缺失值(因为总是要使用2个或3个数据点),但是在第2页中将使用NaN占位符。 NaN被找到了。
我的问题是:如何在忽略NaN的同时沿第三维向下趋势?
我尝试过使用detrend3(在Matlab文件交换中找到:https://www.mathworks.com/matlabcentral/fileexchange/61328-detrend3?focused=7203929&tab=function),这在去除3-d数组时没有缺失值时效果很好。
使用NaN进行降级会产生错误。我已经尝试忽略NaN并将NaN设置为-9999然后忽略该数字,但无法使这些努力工作。
非常感谢任何有关前进方向的指导。
答案 0 :(得分: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.