Matlab中的movmean函数是否创建矩阵所有维度的平均值?

时间:2019-04-04 13:23:16

标签: arrays matlab

我正在尝试平滑矩阵中每个像素的时间历史-换句话说,试图通过“空间”(mxn)和“时间”(三维)来平滑每个像素。我正在使用movmean函数在1000x1000x8矩阵的时间内创建每个像素的平均值。

我当前正在使用以下代码对第三个维度进行平均,窗口大小为5,

av_matrix = movmean(my_matrix,5,3)

这正在创建预期的平均值,但是我想知道窗口是否仅在mxn方向上运行,而不是沿第三维取平均值。

1 个答案:

答案 0 :(得分:0)

要计算 n 维数组的 n 维的移动平均值(“窗口”是 n -维矩形),最简单的方法是使用卷积(请参见convn)。

您需要注意边缘效果,也就是说,当卷积核(或 n 维窗口)部分滑出数据时。 movmean所做的只是在实际数据点上的平均值。要实现该行为,您可以

    使用'same'选项通过卷积
  1. 在内核上计算 sum ;然后
  2. 将每个条目除以实际个数据点的数量即可计算得出。也可以通过卷积获得该数字,即将卷积应用于一个1的数组。

因此,您所需要做的就是:

my_matrix = randi(9,5,5,3); % example 3D array
sz = [3 3 2]; % 3D window size
av_matrix = convn(my_matrix, ones(sz), 'same') ...          % step 1
          ./convn(ones(size(my_matrix)), ones(sz), 'same'); % step 2

检查

以下示例使用

>> my_matrix
my_matrix(:,:,1) =
     6     8     2     1     8
     4     6     7     9     8
     4     5     1     4     3
     5     5     8     7     9
     3     6     6     4     9
my_matrix(:,:,2) =
     8     8     5     3     6
     8     9     6     9     1
     9     5     6     2     2
     1     7     4     1     2
     5     4     7     4     9
my_matrix(:,:,3) =
     6     5     8     6     6
     1     6     8     6     1
     5     5     1     6     7
     1     1     2     9     8
     1     2     6     1     2

具有边缘效果:

>> mean(mean(mean(my_matrix(1:2,1:2,1:2))))
ans =
   7.125000000000000
>> av_matrix(1,1,1)
ans =
   7.125000000000000

没有边缘效果:

>> mean(mean(mean(my_matrix(1:3,1:3,1:2))))
ans =
   5.944444444444445

>> av_matrix(2,2,1)
ans =
   5.944444444444445