gpt4 book ai didi

matlab - 计算 3d 矩阵数据的每日最小值

转载 作者:太空宇宙 更新时间:2023-11-03 20:01:28 24 4
gpt4 key购买 nike

我有一个包含整个地球气温的大型 3d 矩阵,数据格式为经度 x 纬度 x 时间,每小时分辨率。我想找到一种可靠的方法来计算每个纬度/经度位置的每日最低温度。一个例子:

lon = -180:10:180;
lat = -90:10:90;
time = datenum('2009-01-01 00:00','yyyy-mm-dd HH:MM'):1/24:datenum('2009-01-05 23:00','yyyy-mm-dd HH:MM');
data = randn(length(lon),length(lat),length(time));

这是我的数据。它包括不同位置的气温,以每小时的分辨率提供。下面的代码是我尝试计算每天的最小值。

% find number of unique days
datev = datevec(time);
[ia,ib,ic] = unique(datev(:,1:3),'rows');
uic = unique(ic);

% first re-structure data to 2d matrix
rdata = nan(length(time),length(lon)*length(lat));
for i = 1:length(ic);
dd = data(:,:,i);
rdata(i,:) = dd(:);
end

% then calculate the minimum value for each day
min_data = nan(length(uic),length(lon)*length(lat));
for i = 1:length(uic);
idx = find(ic == uic(i));
min_data(i,:) = min(rdata(idx,:),[],1);
end
min_data = reshape(min_data,length(lon),length(lat),length(uic));

我认为这个答案是正确的,至少当我看答案时似乎是这样。

我的问题是 (1) 我的方法是否正确,以及 (2) 是否有更好的方法来执行此操作,而不必重组数据并循环遍历不同的独特日期。我考虑过使用 accumarray 但不知道如何使用 3d 矩阵来处理它。

感谢任何广告。

最佳答案

您可以使用 unique 的输出第三个输出作为 accumarray 的输入来对数据进行分组。作为第二个输入,您可以提供 1 和数据大小 (numel(ic)) 之间的所有数字。然后对于第四个输入,您可以创建一个匿名函数,该函数将接收对应于每一天的索引(第三维),它可以使用这些来获取当天所有纬度/经度的温度,您可以计算最小值通过计算沿第三个维度的 min 为每个纬度/经度。

datev = datevec(time);
[~,~,ic] = unique(datev(:,1:3),'rows');

min_temps = accumarray(ic, (1:numel(ic))', [], @(x){min(data(:,:,x), [], 3)});
min_temps = cat(3, min_temps{:})

这种方法的好处在于它不一定需要一天正好 24 个样本。如果您可以保证 24 个样本,您可以只 reshape 数据,然后计算 min,而无需使用 accumarray

reshaped = reshape(data, size(data, 1), size(data, 2), 24, []);
min_temps = squeeze(min(reshaped, [], 3));

关于matlab - 计算 3d 矩阵数据的每日最小值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39980195/

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