我正在尝试平滑矩阵中每个像素的时间历史-换句话说,试图通过“空间”(mxn)和“时间”(三维)来平滑每个像素。我正在使用movmean函数在1000x1000x8矩阵的时间内创建每个像素的平均值。
我当前正在使用以下代码对第三个维度进行平均,窗口大小为5,
av_matrix = movmean(my_matrix,5,3)
这正在创建预期的平均值,但是我想知道窗口是否仅在mxn方向上运行,而不是沿第三维取平均值。
答案 0 :(得分:0)
要计算 n 维数组的 n 维的移动平均值(“窗口”是 n -维矩形),最简单的方法是使用卷积(请参见convn
)。
您需要注意边缘效果,也就是说,当卷积核(或 n 维窗口)部分滑出数据时。 movmean
所做的只是在实际数据点上的平均值。要实现该行为,您可以
'same'
选项通过卷积因此,您所需要做的就是:
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