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

标签 matlab matrix

我有一个 60 x 21 x 700 矩阵,其中 60 x 21 代表一个压力输出 x 帧数。我想找到每帧生成最大平均压力的 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

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

06 10
08 09

= 8.25

到目前为止,在我寻找解决方案的过程中,我只能找到一种方法来获得最大值(例如,上面矩阵中的 10),但真的无法解决如何从没有固定索引引用的小区域获得最大平均值。我是 MATLAB 的新手,所以如果我错过了什么或者只是没有正确理解事情,我深表歉意。 任何帮助或指导将不胜感激。

最佳答案

二维数组:对于给定的二维数组输入,您可以使用 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)

代码的逐步运行示例 -

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

多维数组:对于多维数组的情况,你需要执行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)

示例输入、输出-

>> 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

关于matlab - 多维数组的滑动最大窗口及其平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30072284/

相关文章:

c - 从 C 文件中读取的矩阵

c++ - 初始化动态数组

excel - 使用 Excel 计算协方差矩阵

python - 有效检测大图像中的形状

image-processing - 如何在matlab中对RGB矩阵执行power()函数

math - 如何在 THREE.js 中找到两个向量之间的旋转矩阵

python - 将mat文件转换为pandas dataframe问题

matlab - 有效地将数据拆分为 bin

matlab - 如何裁剪图像并将其旋转到边界框?

r - 阈值向量自回归模型的估计