第三十四天:矩阵转置
矩阵转置
一、问题描述
-
输入:
- 首先输入两个整数
n
和m
,分别表示矩阵的行数和列数 - 数据范围限制:
1 <= n <= 100
,1 <= m <= 100
- 接下来输入完整的矩阵数据:
- 共
n
行输入 - 每行包含
m
个整数 - 每个矩阵元素的取值范围是
1
到1000
- 共
- 首先输入两个整数
-
矩阵转置的定义:
- 转置矩阵是指将原矩阵的行列互换得到的新矩阵
- 数学表示:如果原矩阵是
A
,那么转置矩阵记作A^T
- 元素位置关系:
A^T[j][i] = A[i][j]
(其中0 <= i < n
,0 <= j < m
) - 转置前后的矩阵维度变化:原矩阵是n×m的,转置后变为m×n的矩阵
- 对角线元素保持不变:对于方阵(n=m),主对角线上的元素在转置前后位置不变
-
输出要求:
- 输出
m
行,每行n
个整数 - 输出格式:同一行的相邻整数之间用单个空格隔开
- 行末不要有多余的空格
- 输出的转置矩阵要严格对齐,保持矩阵的整齐格式
- 输出
-
示例说明:
输入示例1:2 3 1 2 3 4 5 6
对应的转置矩阵输出应该是:
1 4 2 5 3 6
输入示例2(方阵情况):
3 3 1 2 3 4 5 6 7 8 9
输出:
1 4 7 2 5 8 3 6 9
二、C++ 代码实现
#include <iostream>
using namespace std;int main() {int n, m;cin >> n >> m;int matrix[100][100];// 读取矩阵元素for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {cin >> matrix[i][j];}}// 输出转置矩阵for (int j = 0; j < m; j++) {for (int i = 0; i < n; i++) {cout << matrix[i][j];if (i < n - 1) {cout << " ";}}cout << endl;}return 0;
}
三、解析
-
读取矩阵元素:
int matrix[100][100];
创建了一个二维数组matrix
,由于题目中限定矩阵的最大行数和列数为100,所以这里定义的数组大小为100 x 100
。这个数组将用于存储输入的矩阵元素。在内存中,这个数组会按照行优先顺序连续存储,即先存储第一行的所有元素,接着是第二行,依此类推。例如,对于一个3x2的矩阵,元素在内存中的存储顺序是:matrix[0][0], matrix[0][1], matrix[1][0], matrix[1][1], matrix[2][0], matrix[2][1]。- 接下来的两层嵌套
for
循环是读取矩阵元素的关键部分。外层循环for (int i = 0; i < n; i++)
控制行数,其中i
从0开始到n-1
结束,表示当前处理的行号。内层循环for (int j = 0; j < m; j++)
控制列数,j
从0开始到m-1
结束,表示当前处理的列号。在每次循环中,cin >> matrix[i][j];
从标准输入流中读取一个整数,并将其存储到matrix
数组对应的(i, j)
位置。例如,当输入矩阵为[[1,2],[3,4]]时,第一次循环(i=0,j=0)读入1,第二次循环(i=0,j=1)读入2,第三次循环(i=1,j=0)读入3,第四次循环(i=1,j=1)读入4。这样,通过循环遍历,我们就可以将整个矩阵的元素存储到matrix
数组中。
-
输出转置矩阵:
- 这里同样使用了两层嵌套的
for
循环,但与读取矩阵元素时的循环顺序有所不同。外层循环for (int j = 0; j < m; j++)
控制转置矩阵的行数(实际上是原矩阵的列数),内层循环for (int i = 0; i < n; i++)
控制转置矩阵的列数(实际上是原矩阵的行数)。这种循环顺序的改变实现了矩阵的行列转置。例如对于一个2x3的矩阵[[1,2,3],[4,5,6]],转置后为3x2矩阵[[1,4],[2,5],[3,6]]。 cout << matrix[i][j];
这行代码输出矩阵元素。因为我们要输出的是转置矩阵,所以这里的索引顺序与读取时相反,即输出的是原矩阵的(i,j)
位置元素,但显示在转置矩阵的(j,i)
位置,实现了行和列的互换。if (i < n - 1) { cout << " "; }
这部分代码是为了满足输出格式要求。它检查当前输出的元素是否是该行的最后一个元素(即i
是否小于n-1
),如果不是,则在元素后面输出一个空格。例如,当n=3时,在输出第1个和第2个元素后会加空格,但输出第3个元素后不加空格,确保相邻两个整数之间用单个空格隔开。- 内层循环结束后,
cout << endl;
输出换行符,使下一行的元素在新的一行输出。例如对于一个3x2矩阵的转置输出,每行输出2个元素后就会换行。这样,通过循环遍历,我们就可以按要求输出转置后的矩阵。同时,这种输出方式也符合题目要求的"每个元素后面没有多余的空格,每行末尾没有多余的空格"的格式规范。
- 这里同样使用了两层嵌套的