gpt4 book ai didi

arrays - 对 3 维数组进行去趋势处理时忽略 NaN

转载 作者:行者123 更新时间:2023-12-02 02:16:44 26 4
gpt4 key购买 nike

我使用的是Matlab 2016a;我正在尝试沿第三维消除三维数组的趋势,但其中存在缺失值。由于位置与地理位置相关,因此值必须保持在数组中的相同位置,这一点至关重要。 3-d array

在此图中,假设第 2 页在随机位置具有 NaN,但第 1 页和第 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,然后忽略该数字,但无法使这些努力发挥作用。

任何关于前进方向的指导将不胜感激。

最佳答案

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.

关于arrays - 对 3 维数组进行去趋势处理时忽略 NaN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45001976/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com