首页 > 解决方案 > 如何在输入“N”乘“N”矩阵的中心找到“M”乘“M”子矩阵?(在 Matlab 中)

问题描述

如何在 Matlab 中编写函数以在 N x N 输入矩阵的中心输出 M x M 子矩阵?该函数应该有两个输入参数——N x N 输入矩阵(2D 数组)和要从输入矩阵中提取的方形子矩阵 M 的大小。唯一的输出应该是输入矩阵中心的 M x M 子矩阵。该函数应该使用 for 循环来提取子矩阵,而不是对这部分代码使用冒号或任何内置函数。该函数应适用于 N ≥ 3 的任何方形输入矩阵。如果 N 为偶数,则 M 应为偶数。如果 N 是奇数,则 M 应该是奇数。

这是到目前为止我的流程图的图片。

标签: matlab

解决方案


使用 For 循环和偏移索引

前言:

在这里,我喜欢将这个问题可视化为修剪矩阵。我在这个例子中表示的修剪量是Trim_Amount. 指示子矩阵的Trim_Amount大小和开始读取/保存子矩阵的起点。

扫描/保存子矩阵

由于修剪量总是从每一侧获取,因此您可以期望子矩阵具有以下形式的维度:

子矩阵宽度 = M - (2 × Trim_Amount)

2 × Trim_Amount 将始终导致偶数,因此可以说以下内容:

如果 M 是偶数 → M - (偶数) → 偶数
如果 M 是奇数 → M - (偶数) → 奇数


测试输出结果:

输出结果 我建议仔细阅读代码以过滤任何意外问题。

完整脚本:

Dimension = 7;
Matrix = round(100*rand(Dimension));
Trim_Amount = 1;

[Sub_Matrix] = Grab_Sub_Matrix(Matrix,Trim_Amount);
Matrix
Sub_Matrix
    
%Function definition%
function [Sub_Matrix] = Grab_Sub_Matrix(Matrix,Trim_Amount) 

%Minimum of M must be 5 since N >= 3%
[M,~] = size(Matrix);


%Ensuring the trimming factor does not go over possible range%
Max_Trimming_Factor = M - 3;
if(Trim_Amount > Max_Trimming_Factor)
Trim_Amount = Max_Trimming_Factor;
end


%Fill in the boundaries%
Row_Start_Limit = Trim_Amount + 1;
Column_Start_Limit = Trim_Amount + 1;

%Creating sub-matrix based on amount of trimming%
Sub_Matrix = zeros(M-(2*Trim_Amount),M-(2*Trim_Amount));

for Row = 1: length(Sub_Matrix)
   for Column = 1: length(Sub_Matrix) 
    
%    fprintf("(%d,%d)\n",Row,Column);  
   Sub_Matrix(Row,Column) = Matrix(Row + Row_Start_Limit-1,Column + Column_Start_Limit-1);
    
   end
end

end

使用 MATLAB R2019b 运行


推荐阅读