矩阵旋转
Published on 2024-07-20 16:27 in 暂未分类 with Tomorrowland_D

矩阵旋转

矩阵旋转是一种常见的操作,通常包括将矩阵顺时针或逆时针旋转90度、180度或270度等。这里我将简要介绍如何进行顺时针旋转90度的操作,并给出示例代码。

顺时针旋转90度的方法:

要顺时针旋转一个n x n的矩阵,可以采用以下步骤:

  1. 转置矩阵:先将矩阵转置,即行变成列,列变成行。

  2. 反转每一行:然后反转每一行,可以得到顺时针旋转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;
}

解释代码:

  1. rotate 函数中的第一个循环实现了矩阵的转置,通过交换 matrix[i][j]matrix[j][i] 实现。

  2. rotate 函数中的第二个循环实现了每一行的反转,通过交换 matrix[i][j]matrix[i][n-1-j] 实现。

  3. 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度,可以按照以下步骤进行:

  1. 转置矩阵:先将矩阵转置,即行变成列,列变成行。

  2. 反转每一列:然后反转每一列,可以得到逆时针旋转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;
}

解释代码:

  1. rotateCounterClockwise 函数中的第一个循环实现了矩阵的转置,通过交换 matrix[i][j]matrix[j][i] 实现。

  2. rotateCounterClockwise 函数中的第二个循环实现了每一列的反转,通过交换 matrix[i][j]matrix[n-1-i][j] 实现。

  3. 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;
}
posted @   Tomorrowland_D  阅读(183)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示