Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何在matlab中求4D阵列的第一维均值?_Arrays_Matlab_Multidimensional Array_Mean - Fatal编程技术网

Arrays 如何在matlab中求4D阵列的第一维均值?

Arrays 如何在matlab中求4D阵列的第一维均值?,arrays,matlab,multidimensional-array,mean,Arrays,Matlab,Multidimensional Array,Mean,我有一个维度为(122169137,16)的4D数组,其中122是天,169和137是纬度,16是年份。 我必须找到每年122天的平均值。我试过这样的方法: for i=1:122 for j=1:16 c=t1(i,:,:,j) d=mean(c(:)); end end 但它说指数超过了矩阵的维数 我是matlab的新手。你能给我推荐一个简单的方法吗 似乎t1是输入4D数组。您需要使用permute重新排列输入数组的维度,使第四维

我有一个维度为(122169137,16)的4D数组,其中122是天,169和137是纬度,16是年份。 我必须找到每年122天的平均值。我试过这样的方法:

for i=1:122
     for j=1:16
         c=t1(i,:,:,j)
         d=mean(c(:));
     end 
end 
但它说指数超过了矩阵的维数


我是matlab的新手。你能给我推荐一个简单的方法吗

似乎
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(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个元素的向量,包含每年的平均天数

关于您的代码:

  • 变量d是一个标量,但在两个嵌套for循环中使用。这意味着无论它计算什么,它都只返回两个循环最后一次迭代的平均值。正确使用它将是d(i,j),因此它存储每个循环的所有平均值
  • 您正在计算c的平均值(:),其中c的维数为[1169236,1]。这意味着您将矩阵排序为一个向量,同时计算lat+long的平均值

对于二维矩阵,
X
平均值(X(:)
平均值(X,1),2)相同,并使用

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

它首先在第二维度上取平均值,然后在第三维度上取平均值,从而得到一个大小为122 x 1 x 1 x 16的矩阵。然后
挤压
将其转换为大小为
122 x 16的矩阵

检查平均值的文档。如果我没有弄错的话,您可以将维度定义为第二个条目:
mean(c,1)
Btw。您希望得到什么结果?毕竟你有4个维度,也就是说,通过做平均维度,你会得到一个3d结果。你想要吗?如果是这样的话,
mean(c)
就应该这样做,因为它从第一维度开始。另外,您可能需要进一步解释您的问题,您的意思是
查找每年122天的平均值吗
?看起来是这样的,因为您有-
“t1(i,:,:,j)”
。谢谢您的回复。我应该生成16个矩阵,我猜是1列矩阵,这样我可以绘制这些矩阵的pdf。@Vidhi,每个矩阵的长度是多少?这就是每个矩阵中有多少个元素?谢谢你的回答。我尝试了您的建议,但在使用“重塑”命令时出现错误。@Vidhi您确定复制的正确吗?我制作了一个由这些维度的随机值组成的矩阵t1,代码运行良好。您甚至不需要重塑线,因为矩阵c已经减少到[122,1]。但它可能是旧版本的Matlab不支持的,我使用的是R2013a。