Matlab 多维数组的滑动最大窗及其平均值
我有一个Matlab 多维数组的滑动最大窗及其平均值,matlab,matrix,Matlab,Matrix,我有一个60 x 21 x 700矩阵,其中60 x 21表示压力输出x帧数。我想找到生成每帧最大平均压力的2x2窗口,并将其存储在一个新变量中,以便可以绘制它。例如,如果矩阵看起来像这样: 01 02 02 01 01 02 01 01 02 02 02 03 04 04 03 01 02 06 10 05 02 02 08 09 05 2x2窗口的最大窗口及其平均值为- 06 10 08 09 = 8.25 到目前为止,在我寻找解决方案的过程中,我只能找到一种获得最大值的方法(例如,从
60 x 21 x 700
矩阵,其中60 x 21
表示压力输出
x帧数
。我想找到生成每帧最大平均压力的2x2
窗口,并将其存储在一个新变量中,以便可以绘制它。例如,如果矩阵看起来像这样:
01 02 02 01 01
02 01 01 02 02
02 03 04 04 03
01 02 06 10 05
02 02 08 09 05
2x2
窗口的最大窗口及其平均值为-
06 10
08 09
= 8.25
到目前为止,在我寻找解决方案的过程中,我只能找到一种获得最大值的方法(例如,从上面的矩阵中获得10
),但实际上无法解决如何从没有固定索引的小区域中获得最大平均值。我对MATLAB相当陌生,因此,如果我错过了一些东西,或者只是没有正确理解一些东西,我深表歉意。
任何帮助或指导都将不胜感激 二维数组:对于给定的二维数组输入,可以使用- 代码的逐步运行示例-
A =
1 2 2 1 1
2 1 1 2 2
2 3 4 4 3
1 2 6 10 5
2 2 8 9 5
conv2_out =
6 6 6 6 3
8 9 11 11 5
8 15 24 22 8
7 18 33 29 10
4 10 17 14 5
idx =
14
R =
4
C =
3
max_window =
6 10
8 9
out =
8.25
多维数组:对于多维数组的情况,您需要执行- 样本输入、输出-
>> A
A(:,:,1) =
4 1 9 9
3 7 5 5
9 6 1 6
7 1 1 5
4 2 2 1
A(:,:,2) =
9 4 2 2
3 6 4 5
3 9 1 1
6 6 8 8
5 3 6 4
A(:,:,3) =
5 5 7 7
6 1 9 9
7 7 5 4
4 1 3 7
1 9 3 1
>> max_window
max_window(:,:,1) =
9 9
5 5
max_window(:,:,2) =
8 8
6 4
max_window(:,:,3) =
7 7
9 9
>> max_avg_vals
max_avg_vals =
7 6.5 8
另一种方法是使用
结果:
>> mat
mat =
6 10
8 9
>> C
C =
1.5000 1.5000 1.5000 1.5000
2.0000 2.2500 2.7500 2.7500
2.0000 3.7500 6.0000 5.5000
1.7500 4.5000 8.2500 7.2500
>> B
B =
8.2500
移动平均可以通过简单的卷积来实现。在您的情况下,它必须是二维的,因此:
A = [01 02 02 01 01
02 01 01 02 02
02 03 04 04 03
01 02 06 10 05
02 02 08 09 05];
B = [1 1;1 1] / 4 ; %// prepare moving average filter [2x2]
C = conv2(A,B,'valid') ; %// perform 2D moving average
产生:
C =
1.5 1.5 1.5 1.5
2 2.25 2.75 2.75
2 3.75 6 5.5
1.75 4.5 8.25 7.25
这正好是每个[2x2]区域的平均值。矩阵的维数不能被
2
整除。你想怎么做?@SanthanSalai,我认为OP考虑的是“滑动”平均值,因此矩阵大小不必是窗口大小的精确倍数。Gumajin,你能确认一下吗?@Hoki是的,我想这将是最接近我想要达到的目标。对不起,如果我的问题不是很清楚的话。我正要键入完全相同的内容。我认为这是最有效的方法,因为过去的conv2
速度非常快。该死的,你总是在这方面打败我!干得好;-)@Hoki抱歉!:)事实证明,我们甚至不需要在每个窗口中找到平均值。非常感谢。因此,如果我想为所有700帧计算此值,那么放入for循环是否有效?请注意,如果对卷积输出选项使用valid
而不是same
,则不必丢弃最后一行和最后一列(因为它们只是2个值的平均值,而不是4个值)。
>> mat
mat =
6 10
8 9
>> C
C =
1.5000 1.5000 1.5000 1.5000
2.0000 2.2500 2.7500 2.7500
2.0000 3.7500 6.0000 5.5000
1.7500 4.5000 8.2500 7.2500
>> B
B =
8.2500
A = [01 02 02 01 01
02 01 01 02 02
02 03 04 04 03
01 02 06 10 05
02 02 08 09 05];
B = [1 1;1 1] / 4 ; %// prepare moving average filter [2x2]
C = conv2(A,B,'valid') ; %// perform 2D moving average
C =
1.5 1.5 1.5 1.5
2 2.25 2.75 2.75
2 3.75 6 5.5
1.75 4.5 8.25 7.25