滑动最大窗口及其多维数组的平均值

Gum*_*jin 11 matlab matrix

我有一个60 x 21 x 700矩阵,其中60 x 21代表一个pressure outputx number of frames.我想找到2 x 2生成每帧最大平均压力的窗口,并将其存储在一个新变量中,以便绘制它.例如,如果矩阵看起来像这样:

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
Run Code Online (Sandbox Code Playgroud)

最大窗口及其窗口的平均值为2 x 2-

06 10
08 09

= 8.25
Run Code Online (Sandbox Code Playgroud)

到目前为止,在我寻找解决方案时,我只能找到一种方法来获得最大值(例如,10来自上面的矩阵),但实际上无法弄清楚如何从一个小区域获得最大平均值没有固定的索引来引用.我对MATLAB很新,所以如果我错过了某些内容或者根本没有正确理解事情,我很抱歉.任何帮助或指导将不胜感激.

Div*_*kar 13

2D阵列:对于给定的2D阵列输入,您可以使用2D convolution-

%// Perform 2D convolution with a kernel of `2 x 2` size with all ones
conv2_out = conv2(A,ones(2,2),'same')

%// Find starting row-col indices of the window that has the maximum conv value
[~,idx] = max(conv2_out(:))
[R,C] = ind2sub(size(A),idx)

%// Get the window with max convolution value
max_window = A(R:R+1,C:C+1)

%// Get the average of the max window
out =  mean2(max_window)
Run Code Online (Sandbox Code Playgroud)

示例逐步运行代码 -

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
Run Code Online (Sandbox Code Playgroud)

多维数组:对于多维数组,需要执行ND convolution-

%// Perform ND convolution with a kernel of 2 x 2 size with all ONES
conv_out = convn(A,ones(2,2),'same')

%// Get the average for all max windows in all frames/slices  
[~,idx] = max(reshape(conv_out,[],size(conv_out,3)),[],1)
max_avg_vals = conv_out([0:size(A,3)-1]*numel(A(:,:,1)) + idx)/4

%// If needed, get the max windows across all dim3 slices/frames
nrows = size(A,1)
start_idx = [0:size(A,3)-1]*numel(A(:,:,1)) + idx
all_idx = bsxfun(@plus,permute(start_idx(:),[3 2 1]),[0 nrows;1 nrows+1])
max_window = A(all_idx)
Run Code Online (Sandbox Code Playgroud)

样本输入,输出 -

>> 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
Run Code Online (Sandbox Code Playgroud)