矩阵旋转
矩阵旋转是一种常见的操作,通常包括将矩阵顺时针或逆时针旋转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;
}