matlab - 如何在输入“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 应该是奇数。
解决方案
使用 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 运行
推荐阅读
- jenkins - 如何将 Groovy 配置中设置的值覆盖为 Jenkins 构建参数中的值
- typo3 - 为 TYPO3 8.7 配置 HTTP 代理
- python - 在字典键中查找重复出现的单词并根据它对键进行分组
- pandas - pyspark 生成唯一值的所有组合
- pine-script - Renko Box 尺寸定制(Pine Script)
- r - Bar plot in ggplot, add horizontal subtitle
- javascript - 使用 html-pdf 包动态生成 pdf
- c# - REST API - 规范化数据中的循环引用
- javascript - 其他js页面中的Oracle jet import js函数
- javascript - Chrome 扩展程序中未定义要求