这是一个C语言示例:输入一个 n 行 n 列的整数矩阵,输出其转置矩阵(2≤n≤100)。
要解决该问题应该清楚什么是矩阵的转置。矩阵的转置就是将原矩阵第 i 行的所有数据,依次放入新矩阵的第 i 列,即原矩阵中第 n 行第 m 列的数据被放在了新矩阵的第 m 行第 n 列中(见图 1)。
解决矩阵问题时通常都是先将矩阵元素存放在一个二维数组中,使用双重 for 循环语句来遍历这个二维数组,从而实现对矩阵中所有元素数据的操作。例如,我们可以将图 1 中的矩阵存放在二维数组 A(int A[3][3];)中。
仔细观察图 1 转置前后的矩阵可知,转置后矩阵主对角线上的元素 A[1][1]、A[2][2]、A[3][3] 的值并没有发生变化,只是位于对角线右上方的三个元素与位于对角线左下方的三个元素的值进行了交换,即 A[1][2] 和 A[2][1] 进行了交换,A[1][3] 和 A[3][1] 进行了交换,A[2][3] 和 A[3][2] 进行了交换。进一步观察进行交换的两个数组元素,会发现它们的行号和列号互换了。
根据这个发现我们可以设计算法,用双重 for 循环遍历数组 A,找出对角线左下角的元素(行号大于列号),将其值与对角线右上角的对应元素(行号和列号互换后的元素)的值互换,就可以实现矩阵的转置操作。
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(i>j)
{
k = a[i][j];
a[i][j] = a[j][i];
a[j][i] = k;
}
}
代码清单 1:输入一个 n×n 整数矩阵,输出其转置矩阵(2≤n≤100)
#include <stdio.h>
#include <stdlib.h>
int n,a[100][100];
void doubleCycle(int s)
{
int i,j,k;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(s==0) scanf("%d",&a[i][j]); //读入矩阵
if(s==1) printf("%5d",a[i][j]); //输出矩阵
if(s==2 && i>j) //转置
{
k=a[i][j]; a[i][j]=a[j][i]; a[j][i]=k;
}
}
if(s==1) printf("\n"); //输出矩阵行结束符
}
}
int main( )
{
printf("输入一个正整数n(1<n<101):");
scanf("%d",&n);
printf("依次输入%d*%d矩阵所有%d个元素:\n",n,n,n*n);
doubleCycle(0); //调用函数读入矩阵
printf("原始矩阵:\n");
doubleCycle(1); //调用函数输出原矩阵
doubleCycle(2); //调用函数将原矩阵转置
printf("转置以后的矩阵:\n");
doubleCycle(1); //调用函数输出转置结果
system("pause");
return 0;
}
运行结果为:
输入一个正整数n(1<n<101):5
依次输入5*5矩阵所有25个元素:
3 4 2 5 6 6 7 7 7 8 8 3 2 5 4 8 8 4 2 6 1 0 5 7 7
原始矩阵:
3 4 2 5 6
6 7 7 7 8
8 3 2 5 4
8 8 4 2 6
1 0 5 7 7
转置以后的矩阵:
3 6 8 8 1
4 7 3 8 0
2 7 2 4 5
5 7 5 2 7
6 8 4 6 7