矩阵旋转
矩阵旋转是一种常见的操作,通常包括将矩阵顺时针或逆时针旋转90度、180度或270度等。这里我将简要介绍如何进行顺时针旋转90度的操作,并给出示例代码。
顺时针旋转90度的方法:
要顺时针旋转一个n x n的矩阵,可以采用以下步骤:
-
转置矩阵:先将矩阵转置,即行变成列,列变成行。
-
反转每一行:然后反转每一行,可以得到顺时针旋转90度后的矩阵。
具体步骤如下:
- 转置矩阵:对于矩阵中的每对元素
(i, j)
和(j, i)
,进行交换。 - 反转每一行:对于矩阵的每一行,将元素按照中心轴进行交换。
示例代码:
以下是一个C++示例代码,演示了如何实现顺时针旋转90度的操作:
#include <iostream> #include <vector> using namespace std; void rotate(vector<vector<int>>& matrix) { int n = matrix.size(); // Step 1: Transpose the matrix for (int i = 0; i < n; ++i) { for (int j = i + 1; j < n; ++j) { swap(matrix[i][j], matrix[j][i]); } } // Step 2: Reverse each row for (int i = 0; i < n; ++i) { for (int j = 0; j < n / 2; ++j) { swap(matrix[i][j], matrix[i][n - 1 - j]); } } } // Function to print a matrix void printMatrix(const vector<vector<int>>& matrix) { int n = matrix.size(); for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { cout << matrix[i][j] << " "; } cout << endl; } } int main() { vector<vector<int>> matrix = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; cout << "Original Matrix:" << endl; printMatrix(matrix); rotate(matrix); cout << "\nMatrix after 90 degree clockwise rotation:" << endl; printMatrix(matrix); return 0; }
解释代码:
-
rotate
函数中的第一个循环实现了矩阵的转置,通过交换matrix[i][j]
和matrix[j][i]
实现。 -
rotate
函数中的第二个循环实现了每一行的反转,通过交换matrix[i][j]
和matrix[i][n-1-j]
实现。 -
printMatrix
函数用于打印矩阵,方便查看旋转前后的效果。
示例输出:
运行上述代码,将输出如下结果:
Original Matrix: 1 2 3 4 5 6 7 8 9 Matrix after 90 degree clockwise rotation: 7 4 1 8 5 2 9 6 3
这就是顺时针旋转90度后的矩阵。
以上是顺时针旋转矩阵,在下面我将介绍逆时针旋转矩阵:
逆时针旋转一个n x n的矩阵90度,可以采用类似的方法,但是步骤略有不同。以下是逆时针旋转90度的方法和示例代码:
逆时针旋转90度的方法:
要逆时针旋转一个n x n的矩阵90度,可以按照以下步骤进行:
-
转置矩阵:先将矩阵转置,即行变成列,列变成行。
-
反转每一列:然后反转每一列,可以得到逆时针旋转90度后的矩阵。
具体步骤如下:
- 转置矩阵:对于矩阵中的每对元素
(i, j)
和(j, i)
,进行交换。 - 反转每一列:对于矩阵的每一列,将元素按照中心轴进行交换。
示例代码:
以下是一个C++示例代码,演示了如何实现逆时针旋转90度的操作:
#include <iostream> #include <vector> using namespace std; void rotateCounterClockwise(vector<vector<int>>& matrix) { int n = matrix.size(); // Step 1: Transpose the matrix for (int i = 0; i < n; ++i) { for (int j = i + 1; j < n; ++j) { swap(matrix[i][j], matrix[j][i]); } } // Step 2: Reverse each column for (int j = 0; j < n; ++j) { for (int i = 0; i < n / 2; ++i) { swap(matrix[i][j], matrix[n - 1 - i][j]); } } } // Function to print a matrix void printMatrix(const vector<vector<int>>& matrix) { int n = matrix.size(); for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { cout << matrix[i][j] << " "; } cout << endl; } } int main() { vector<vector<int>> matrix = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; cout << "Original Matrix:" << endl; printMatrix(matrix); rotateCounterClockwise(matrix); cout << "\nMatrix after 90 degree counter-clockwise rotation:" << endl; printMatrix(matrix); return 0; }
解释代码:
-
rotateCounterClockwise
函数中的第一个循环实现了矩阵的转置,通过交换matrix[i][j]
和matrix[j][i]
实现。 -
rotateCounterClockwise
函数中的第二个循环实现了每一列的反转,通过交换matrix[i][j]
和matrix[n-1-i][j]
实现。 -
printMatrix
函数用于打印矩阵,方便查看旋转前后的效果。
示例输出:
运行上述代码,将输出如下结果:
Original Matrix: 1 2 3 4 5 6 7 8 9 Matrix after 90 degree counter-clockwise rotation: 3 6 9 2 5 8 1 4 7
这就是逆时针旋转90度后的矩阵。
以下标为1开始的示例代码:
以上代码都是基于从0开始的下标,以下我将介绍从下标为1开始的代码:
顺时针旋转90度:
#include <iostream> #include <vector> using namespace std; void rotateClockwise(vector<vector<int>>& matrix) { int n = matrix.size() - 1; // 矩阵大小(去除空行) // Step 1: 转置矩阵 for (int i = 1; i <= n; ++i) { for (int j = i + 1; j <= n; ++j) { swap(matrix[i][j], matrix[j][i]); } } // Step 2: 反转每一行 for (int i = 1; i <= n; ++i) { for (int j = 1; j <= n / 2; ++j) { swap(matrix[i][j], matrix[i][n - j + 1]); } } } // 打印矩阵的函数(1-based索引) void printMatrix(const vector<vector<int>>& matrix) { int n = matrix.size() - 1; // 矩阵大小(去除空行) for (int i = 1; i <= n; ++i) { for (int j = 1; j <= n; ++j) { cout << matrix[i][j] << " "; } cout << endl; } } int main() { vector<vector<int>> matrix = { {}, {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; int n = matrix.size() - 1; // 矩阵的大小 cout << "原始矩阵:" << endl; printMatrix(matrix); rotateClockwise(matrix); cout << "\n顺时针旋转90度后的矩阵:" << endl; printMatrix(matrix); return 0; }
逆时针旋转90度:
#include <iostream> #include <vector> using namespace std; void rotateCounterClockwise(vector<vector<int>>& matrix) { int n = matrix.size() - 1; // 矩阵大小(去除空行) // Step 1: 转置矩阵 for (int i = 1; i <= n; ++i) { for (int j = i + 1; j <= n; ++j) { swap(matrix[i][j], matrix[j][i]); } } // Step 2: 反转每一列 for (int j = 1; j <= n; ++j) { for (int i = 1; i <= n / 2; ++i) { swap(matrix[i][j], matrix[n - i + 1][j]); } } } // 打印矩阵的函数(1-based索引) void printMatrix(const vector<vector<int>>& matrix) { int n = matrix.size() - 1; // 矩阵大小(去除空行) for (int i = 1; i <= n; ++i) { for (int j = 1; j <= n; ++j) { cout << matrix[i][j] << " "; } cout << endl; } } int main() { vector<vector<int>> matrix = { {}, {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; int n = matrix.size() - 1; // 矩阵的大小 cout << "原始矩阵:" << endl; printMatrix(matrix); rotateCounterClockwise(matrix); cout << "\n逆时针旋转90度后的矩阵:" << endl; printMatrix(matrix); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!