矩阵翻转与旋转——模板大全

news/2024/12/17 1:50:16/

目录👈(゚ヮ゚👈

  • 前言
  • 一、 基础操作代码实现
      • 1. 左右反转(通用)
      • 2. 上下反转(通用)
      • 3. 矩阵转置
  • 二、组合操作实现复杂变换
      • 4. 90度顺时针旋转
      • 5. 180度顺时针旋转(通用)
      • 6. 270度顺时针旋转
  • 总结

前言

在处理矩阵(包括非方阵)时,常见的操作包括翻转和旋转。本文将详细介绍如何通过代码实现以下几种矩阵变换:

  1. 左右反转
  2. 上下反转
  3. 90度顺时针旋转矩阵转置 + 左右反转)
  4. 180度顺时针旋转(左右反转 + 上下反转)
  5. 270度顺时针旋转矩阵转置 + 上下反转)

虽然涉及的操作看起来较多,但只需掌握左右反转上下反转矩阵转置这三个基础操作,即可组合实现其他所有的矩阵变换。

另外,正文关于反转方式的后面标注了通用或者仅方阵适用的标签 ; 通用意思是方阵和非方阵都适用;仅方阵适用意思是,仅行列数相等可用。

一、 基础操作代码实现

1. 左右反转(通用)

左右反转指的是将矩阵的每一行进行左右对称交换。

java">public static void leftRight(int[][] m){int row = m.length;int col = m[0].length;for(int i = 0; i < row; i++){for(int j = 0; j < col / 2; j++){int temp = m[i][j];m[i][j] = m[i][col - 1 - j];m[i][col - 1 - j] = temp;}}
}

示例验证

输入矩阵

1 2 3
4 5 6
7 8 9

左右反转后的矩阵

3 2 1
6 5 4
9 8 7

2. 上下反转(通用)

上下反转是将矩阵的每一列进行上下对称交换。

java">public static void upDown(int[][] m){int row = m.length;int col = m[0].length;for(int i = 0; i < row / 2; i++){for(int j = 0; j < col; j++){int temp = m[i][j];m[i][j] = m[row - 1 - i][j];m[row - 1 - i][j] = temp;}}
}

示例验证

输入矩阵

1 2 3
4 5 6
7 8 9

上下反转后的矩阵

7 8 9
4 5 6
1 2 3

3. 矩阵转置

方法一(通用):

矩阵转置是将矩阵的行与列进行互换,适用于方阵和非方阵。

java"> //矩阵转置 通用public static int[][] tran(int[][] m){int row=m.length;int col=m[0].length;int[][] ret=new int[col][row];for(int i=0;i<col;i++){for(int j=0;j<row;j++){ret[i][j]=m[j][i];}}return ret;//ret数组是转置后的数组}

方法二(仅方阵适用):

java">   public static void tranN(int[][] m){int n=m.length;for(int i=0;i<n;i++){for(int j=i;j<n;j++){//注意j从i开始int temp=m[i][j];m[i][j]=m[j][i];m[j][i]=temp;}}}

示例验证

示例1:方阵

输入矩阵

1 2 3
4 5 6
7 8 9

转置后的矩阵

1 4 7
2 5 8
3 6 9

示例2:非方阵

输入矩阵(2行3列):

1 2 3
4 5 6

转置后的矩阵

1 4
2 5
3 6

二、组合操作实现复杂变换

4. 90度顺时针旋转

方法一(通用)

通过创建一个新的矩阵,将原矩阵的元素按90度顺时针旋转后赋值到新矩阵中。

java">public static int[][] r90(int[][] m){int row = m.length;int col = m[0].length;int[][] ret = new int[col][row];for(int i = 0; i < row; i++){for(int j = 0; j < col; j++){ret[j][row - 1 - i] = m[i][j];}}return ret;
}

示例验证

输入矩阵

1 2 3
4 5 6
7 8 9

90度顺时针旋转后的矩阵

7 4 1
8 5 2
9 6 3

方法二(仅适用于方阵)

通过转置左右反转实现90度旋转。

java">public static void r90n(int[][] m){int n = m.length;// 转置for(int i = 0; i < n; i++){for(int j = i; j < n; j++){int temp = m[i][j];m[i][j] = m[j][i];m[j][i] = temp;}}// 左右反转for(int i = 0; i < n; i++){for(int j = 0; j < n / 2; j++){int temp = m[i][j];m[i][j] = m[i][n - 1 - j];m[i][n - 1 - j] = temp;}}
}

示例验证

输入矩阵

1 2 3
4 5 6
7 8 9

90度顺时针旋转后的矩阵

7 4 1
8 5 2
9 6 3

5. 180度顺时针旋转(通用)

通过左右反转上下反转的组合实现180度旋转。

java">public static void r180(int[][] m){int row = m.length;int col = m[0].length;// 左右反转for(int i = 0; i < row; i++){for(int j = 0; j < col / 2; j++){int temp = m[i][j];m[i][j] = m[i][col - 1 - j];m[i][col - 1 - j] = temp;}}// 上下反转for(int i = 0; i < row / 2; i++){for(int j = 0; j < col; j++){int temp = m[i][j];m[i][j] = m[row - 1 - i][j];m[row - 1 - i][j] = temp;}}
}

示例验证

输入矩阵

1 2 3
4 5 6
7 8 9

180度顺时针旋转后的矩阵

9 8 7
6 5 4
3 2 1

另一个示例:非方阵

输入矩阵(2行3列):

1 2 3
4 5 6

180度顺时针旋转后的矩阵

6 5 4
3 2 1

6. 270度顺时针旋转


方法一(通用):

java">public static int[][] r270(int[][] m){int row = m.length;int col = m[0].length;int[][] ret = new int[col][row]; // 行列相反for(int i = 0; i < row; i++){for(int j = 0; j < col; j++){ret[col - 1 - j][i] = m[i][j];}}return ret; // 必须返回新的数组,因为如果行列不相等,那么旋转270度后的矩阵形状是不同的
}

示例验证

输入矩阵(2行3列):

1 2 3
4 5 6

270度顺时针旋转后的矩阵(3行2列):

3 6
2 5
1 4

方法二(仅适用于方阵):

通过转置上下反转实现270度旋转。

java">public static void r270n(int[][] m){int n = m.length;// 转置for(int i = 0; i < n; i++){for(int j = i; j < n; j++){int temp = m[i][j];m[i][j] = m[j][i];m[j][i] = temp;}}// 上下反转for(int i = 0; i < n / 2; i++){for(int j = 0; j < n; j++){int temp = m[i][j];m[i][j] = m[n - 1 - i][j];m[n - 1 - i][j] = temp;}}
}

示例验证

输入矩阵

1 2 3
4 5 6
7 8 9

270度顺时针旋转后的矩阵

3 6 9
2 5 8
1 4 7

总结

通过以上代码模板,我们可以轻松实现矩阵的各种翻转与旋转操作。掌握左右反转上下反转矩阵转置这三个基础操作后,其他复杂的矩阵变换都可以通过组合这些操作来实现。


http://www.ppmy.cn/news/1555731.html

相关文章

Scala的模式匹配变量类型

在Scala模式匹配中&#xff0c;可以匹配多种变量类型。 基本数据类型 - 数值类型&#xff1a;像 Int 、 Double 等。例如&#xff0c;对一个 Double 类型变量进行匹配&#xff1a; scala val num: Double 3.14 num match { case i: Int > println("是整数") ca…

Vue3+Node中使用webrtc推流至mediamtx

前言 项目的 Web 端是 Vue3 框架&#xff0c;后端是 GO 框架。需要实现将客户端的本地摄像头媒体流推送至服务端&#xff0c;而我自己从未有媒体流相关经验&#xff0c;最初 leader 让我尝试通过 RTSP 协议推拉流&#xff0c;我的思路就局限在了 RTSP 方向。 最初使用的服务端…

图论【Lecode_HOT100】

文章目录 1.岛屿数量No.2002.腐烂的橘子No.9943.课程表No.2074.实现Trie&#xff08;前缀树&#xff09;No.208 1.岛屿数量No.200 class Solution {public int numIslands(char[][] grid) {if (grid null || grid.length 0) {return 0;}int numIslands 0;int rows grid.len…

【新立电子】FPC材料的选择与性能优化

FPC柔性线路板&#xff0c;其材料的选择与性能优化&#xff0c;直接关系到电路板的整体性能、可靠性及应用范围&#xff0c;是电子工程师在设计和制造过程中必须高度重视的环节。 在材料选择上&#xff0c;FPC软性电路板倾向于采用高质量的基材、铜箔、覆盖膜及粘合剂。基材方…

一、使用 mdadm 工具在 Ubuntu 上创建 RAID 1(镜像)

在 Ubuntu 上创建 RAID 1&#xff08;镜像&#xff09;可以使用 mdadm 工具。以下是详细的步骤&#xff0c;包括安装必要的工具、创建 RAID 阵列、格式化并挂载 RAID 设备。 步骤一&#xff1a;安装 mdadm 首先确保你已经安装了 mdadm 包&#xff0c;这是管理软件 RAID 所需的…

MAC 头部、IPv4 头部、IPv6 头部、TCP 头部和 UDP 头部

MAC 头部 字段名称长度&#xff08;字节&#xff09;描述目标 MAC 地址6接收设备的 MAC 地址。源 MAC 地址6发送设备的 MAC 地址。以太网类型/长度2表示上层协议类型&#xff08;如 IPv4、IPv6&#xff09;或数据长度&#xff08;以太网 II 或 802.3&#xff09;。数据负载46-1…

IDEA关闭注释折叠

参考&#xff1a;IDEA关闭注释折叠(注释doc的rendered view模式)_idea toggle rendered view-CSDN博客

使用SourceTree登录gitlab

1.注册GitLab账号 2.创建令牌 个人设置里打开访问令牌》》个人访问令牌 点击创建一个新的令牌&#xff0c;根据需要设置权限&#xff0c;有效期可以不设置 点击&#xff0c;创建一个令牌&#xff0c;会生成一个令牌密码&#xff0c;一定要记录保存好&#xff0c;以后不会再显…