【发布时间】:2017-12-26 08:49:21
【问题描述】:
我有一个 NxMxT 数组,其中数组的每个元素都是地球网格。如果网格在海洋上空,则值为 999。如果网格在陆地上空,则它包含观测值。 N是经度,M是纬度,T是月。
特别是,我有一个名为 tmp60 的数组,用于从 1960 年到 1969 年的十年,因此每个网格有 120 个月。
为了测试 1960 年 1 月的全球平均值,我写道:
tmpJan60=tmp60(:,:,1);
tmpJan60(tmpJan60(:,:)>200)=NaN;
nanmean(nanmean(tmpJan60))
这给了我 5.855。
我对 reshape 函数感到困惑。我认为以下代码应该产生相同的平均值,即 5.855,但事实并非如此:
load tmp60
N1=size(tmp60,1)
N2=size(tmp60,2)
N3=size(tmp60,3)
reshtmp60 = reshape(tmp60, N1*N2,N3);
reshtmp60( reshtmp60(:,1)>200,: )=[];
mean(reshtmp60(:,1))
这给了我-1.6265,这是不正确的。
我已经在 Excel (!) 中检查了结果,并且 5.855 是正确的,所以我认为我在 reshape 函数中犯了一个错误。
理想情况下,我想要一个包含每个网格的矩阵,首先沿着 N 维向下移动,然后生成 720 行和 120 列(每列是一个月)。这些前 720 行将代表地球周围相同纬度的一个经度带。接下来,我想将纬度增加 1,从而增加 720 行和 120 列。最终,我想为所有 360 纬度做到这一点。 如果输入经度和纬度,例如第 1 列和第 2 列,则矩阵应如下所示:
temp = [-179.75 -89.75 -1 2 ...
-179.25 -89.75 2 4 ...
...
179.75 -89.75 5 9 ...
-179.75 -89.25 2 5 ...
-179.25 -89.25 3 4 ...
...
-179.75 89.75 2 3 ...
...
179.75 89.75 6 9 ...]
所以temp(:,3) 应该是 1960 年 1 月的所有观测值。
一种方法是:
grid1 = tmp60(1,1,:);
g1 = reshape(grid1, [1,120]);
grid2 = tmp60(2,1,:);
g2 = reshape(grid2,[1,120]);
g = [g1;g2];
但显然很麻烦。
我无法为 N*M 元素自动执行此过程,因此感谢 cmets!
【问题讨论】:
-
你显示 reshtemp1 和 reshtmp60,这是一个错字吗? ... reshtemp1 等于什么?
-
是的,这是一个错字。感谢您的信息!
-
当然,我知道 N 是经度,但 N1、N2、N3 是什么?
-
另外,不应该意味着(reshtmp60(:,1)) 是意味着(reshtmp60(:,3))...您刚刚从中删除Nan's (999) 的同一列?
-
N1=720, N2=360, N3=120
标签: arrays matlab matrix nan reshape