我有一个尺寸为(122,169,137,16)的四维阵列,其中122是天,169是经纬度,而16是一年。 我必须找到每年122天的平均值。我试过这样的:如何在matlab中找到四维数组第一维上的均值?
for i=1:122
for j=1:16
c=t1(i,:,:,j)
d=mean(c(:));
end
end
但它说索引超过矩阵的尺寸。
我是matlab新手。你能否建议我轻松地做到这一点。
我有一个尺寸为(122,169,137,16)的四维阵列,其中122是天,169是经纬度,而16是一年。 我必须找到每年122天的平均值。我试过这样的:如何在matlab中找到四维数组第一维上的均值?
for i=1:122
for j=1:16
c=t1(i,:,:,j)
d=mean(c(:));
end
end
但它说索引超过矩阵的尺寸。
我是matlab新手。你能否建议我轻松地做到这一点。
您可以使用一个事实,即一个二维矩阵,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
的矩阵。
谢谢,它的工作 – MelB 2014-11-08 09:33:03
看来t1
是输入4D阵列。您需要使用permute
来重新排列输入数组的维度,以使第四维成为新的第二维。然后,将其重新组合为三维数组,以便第三维中的每个切片都包含要计算其平均值的所有元素。因此,该代码会是这个样子 -
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))
我不知道,如果你正在寻找的平均天或其他值的平均值。假设你正在寻找天的平均值。一个简单的方法,让你明白发生了什么,是这样的:
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个元素的向量,包含天的平均每年。
关于您的代码:
检查平均值的文档。如果我没有弄错,你可以将维度定义为第二项:'mean(c,1)'Btw。你期望结果如何?毕竟你有4个维度意思是做平均的你得到一个3d结果。你想要那个吗?如果是这样,'意味着(c)'应该做的伎俩,因为它从第一维开始。无论如何,你可能需要进一步解释你的问题 – 2014-10-06 07:25:55
你是不是故意为每年的122天中的每一天找到意思?看来这样,因为你有 - '“t1(i,:,:,j)”'。 – Divakar 2014-10-06 07:32:39
感谢您的回复。我应该生成16个矩阵,这将是我猜想的1列矩阵,以便我可以绘制这些矩阵的pdf。 – MelB 2014-10-06 12:57:39