我有一个尺寸为4D的阵列(122,169,137,16),其中122是天,169& 137 lat long resp和16是年份。 我必须找到每年122天的平均值。我试过这样的事情:
for i=1:122
for j=1:16
c=t1(i,:,:,j)
d=mean(c(:));
end
end
但是它说Index超过了矩阵维度。
我是matlab的新手。你能建议我这么容易吗?
答案 0 :(得分:0)
似乎t1
是输入4D数组。您需要使用permute
重新排列输入数组的维度,以便第四维度成为新的第二维度。然后,将其重新整形为3D阵列,使得第三维中的每个切片保持将要计算其平均值的所有元素。因此,代码看起来像这样 -
mean(reshape(permute(t1,[1 4 2 3]),size(t1,1),size(t1,4),[]),3)
如果您想避免permute
表现,第二种方法是 -
[n1,n2,n3,n4] = size(t1);
output = reshape(mean(reshape(t1,[],n2*n3,n4),2),n1,n4)
在第二种方法中,我们不会重新安排尺寸。相反,我们将第二维和第三维合并为第二维,沿第二维获得平均值,最后重塑它以匹配所需结果的大小。
您还可以使用squeeze
-
squeeze(mean(reshape(t1,[],n2*n3,n4),2))
答案 1 :(得分:0)
我不确定你是在寻找天的平均值还是其他值的平均值。假设您正在寻找天数的平均值。一个简单的方法,让您了解正在发生的事情,如下:
for i=1:16 % for each year (instead of 16 you can use size(t1,4))
c = t1(:,1,1,i); % extract the days, making c a matrix sized [122,1,1,1]
cr = reshape(c,[122,1]); % remove the excess dimensions to make [122,1] (might be unnecessary)
d(i) = mean(cr); % compute the mean and store results into d
end
结果d是16个元素的向量,包含每年的平均天数。
关于您的代码:
答案 2 :(得分:0)
您可以使用以下事实:对于2D矩阵,X
,mean(X(:))
与mean(mean(X,1), 2)
相同并使用
d = squeeze(mean(mean(C,2),3));
首先取第二维上的均值,然后取第三维,得到一个大小为122 x 1 x 1 x 16
的矩阵。然后squeeze
将其转换为大小为122 x 16
的矩阵。