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