Matlab:4维矩阵中的平均值

4
我在Matlab中有一个4维矩阵(时间,一个变量,Y位置,X位置)。
以下是这个4维矩阵的样子:
>> size (npp_data_pft1)
ans =
100     1   289   570

100表示有100个时间步;1表示这里只有1个变量;289和570是y和x方向的格子单元索引。
如何在特定区域内计算平均值?
例如,我想在时间步1中,在33 < Y_location < 47且112 < X_location < 176的区域内得到平均值。

1
请明确问题是什么(最好附上可重现的示例),因为现有的答案似乎已经解决了您的问题。 - Dennis Jaheruddin
如果这样更容易,您可以使用“permute”来消除那个单例维度。 - Amro
3个回答

10

一种方法是提取您的区域,然后取平均值。

A = npp_data_pft1(1, 1, 33:47, 112:176);
mean(A(:))    % returns scalar value

从问题中:“我想在时间步1获取平均值” - Prashant Kumar
啊,确实,你实际上提取了时间和地区。 - Dennis Jaheruddin
抱歉。我们只获取区域平均值,但时间步长仍保持在1到100之间。 - Kuo-Hsien Chang
我想在每个时间步骤中的特定区域获取空间平均值。例如,size(mean_ npp_data_pft1) = 100 1 1 1。 - Kuo-Hsien Chang
我们有两种方法,但我得到了完整的结果:x = randi(10,[100 1 10 25]); 方法#1: mean_x = nanmean(nanmean(x,3),4); 方法#2: M = x(1:100, 1, 1:10, 1:25); mean_x = nanmean(reshape(M,size(M,3)*size(M,4),[]))'; - Kuo-Hsien Chang

7
这里有一个小技巧:
M = npp_data_pft1(:, 1, 33:47, 112:176);
mean(reshape(M,[],size(M,3)*size(M,4))');

在这个示例中,答案将输出每帧所选区域的平均值。我将4D矩阵重塑为2D矩阵,该矩阵有100行(总帧数)和975列(所选区域中像素的总数)。然后,只需在该2D矩阵上使用mean即可得到每帧整个区域的平均值(我使用'来使平均值在正确的维度上工作,您也可以使用mean(...,2))。

你能试试这个方法吗:x=randi(10,[100 1 10 25]); mean_x = nanmean(nanmean(x,3),4); 然后将结果与你的方法进行比较。这两种方法生成的结果不同。 - Kuo-Hsien Chang
你说得对,我在reshape上不够小心,现在维度是正确的(请看[],size(...)而不是size(..),[])。两者的输出都将具有正确的维度,但一个将会重新整理来自不同帧相同行的值,而另一个则是单个帧的数组。 - bla
请注意,我的答案与@Luis Mendo的答案之间仍然存在浮点精度差异。如果您指的是向量与取相同元素数量的数组的两倍平均值之间的区别,则答案中存在消失的差异。例如,请尝试a=rand(1000);b=mean(a(:))-mean(mean(a)) - bla

2

我猜您想对多个时间值求平均数。在这种情况下,我建议使用以下方法,其中1:20代表您想要观察的时间范围:

mean(mean(npp_data_pft1(1:20, 1, 33:47, 112:176),3),4);

这将生成一个20x1的向量,其中包含所需的平均值。

请注意,mean的第二个参数指示计算平均值的维度。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接