2014-10-06 413 views
1

我有一个尺寸为(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新手。你能否建议我轻松地做到这一点。

+0

检查平均值的文档。如果我没有弄错,你可以将维度定义为第二项:'mean(c,1)'Btw。你期望结果如何?毕竟你有4个维度意思是做平均的你得到一个3d结果。你想要那个吗?如果是这样,'意味着(c)'应该做的伎俩,因为它从第一维开始。无论如何,你可能需要进一步解释你的问题 – 2014-10-06 07:25:55

+0

你是不是故意为每年的122天中的每一天找到意思?看来这样,因为你有 - '“t1(i,:,:,j)”'。 – Divakar 2014-10-06 07:32:39

+0

感谢您的回复。我应该生成16个矩阵,这将是我猜想的1列矩阵,以便我可以绘制这些矩阵的pdf。 – MelB 2014-10-06 12:57:39

回答

0

您可以使用一个事实,即一个二维矩阵,Xmean(X(:))相同mean(mean(X,1), 2)和使用

d = squeeze(mean(mean(C,2),3)); 

它首先在二维上取平均值,然后在第三个上得到大小为122 x 1 x 1 x 16的矩阵。然后squeeze将它转换成尺寸为122 x 16的矩阵。

+0

谢谢,它的工作 – MelB 2014-11-08 09:33:03

0

看来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)) 
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个元素的向量,包含天的平均每年。

关于您的代码:

  • 变量d是一个标量,但所用的2嵌套for循环的内部。这意味着无论它计算什么,它只会返回两个循环的最后一次的平均值。正确使用它将是d(i,j),因此它存储了每个循环的所有平均值。
  • 您正在计算c(:)的平均值,其中c的维数为[1,169,236,1]。这意味着你排序矩阵划分成矢量你计算两个纬度+长在一起的平均
+0

感谢您的回复。我尝试了你的建议,但它在使用重塑命令时出错。 – MelB 2014-10-06 12:56:08

+0

@Vidhi你确定你把它复制了吗?我用这些维度做了随机值的矩阵t1,代码运行良好。你甚至不需要重塑线,因为矩阵c已经减少到[122,1]。但它可能是老版本的Matlab不支持的东西,我正在使用R2013a。 – acerne 2014-10-06 14:05:26

相关问题