最近学习啦线性代数有关知识,于是想了一个利用数组解决线性代数中的矩阵转置问题
思路
由线性代数相关知识点,如果将第一个矩阵的所有元素绕着一条从第一行第一列出发的右下角 45° 的射线做镜面反转,那么就可得到这个矩阵的一个转置矩阵。
代码实现
用户需要自定义输入第一个数组(程序中的数组代表线性代数中的矩阵),也就是需要转置运算的数组 A,定义分三个步骤进行:
1、定义该数组的行数
2、定义该数组的列数
3、定义该数组的元素
然后被定义的数组经程序运算,输出转置后的数组 B。
#include <stdio.h> int main() { int i,j,i1,j1,a[101][101],b[101][101]; printf("please input the number of rows(<=100)\n"); scanf("%d",&i1); printf("please input the number of columns(<=100)\n"); scanf("%d",&j1); printf("please input the element\n"); for(i=0;i<i1;i++) for(j=0;j<j1;j++) scanf("%d",&a[i][j]); printf("array a:\n"); for(i=0;i<i1;i++) { for(j=0;j<j1;j++) printf("\t%d",a[i][j]); printf("\n"); } for(i=0;i<i1;i++) for(j=0;j<j1;j++) b[j][i]=a[i][j]; printf("array b:\n"); for(i=0;i<j1;i++) { for(j=0;j<i1;j++) printf("\t%d",b[i][j]); printf("\n"); } return 0; }
总结
主要运用了线性代数及二维数组的特性知识点
1、 二维数组的第一个下标表示行数,第二个下标表示列数,每个下标都是从 0 开始;
2、 类型说明符、数组名和常量表达式的意义与一维数组相同;
3、 二维数组的元素在内存中是“按行存放”,即在内存中先顺序存放第一行的元素,再存放第二行的元素,以此类推;
4、 可以把二维数组看作一种特殊的一维数组,其特殊之处在于它的每一个元素又是一维数组。
5、把m*n矩阵的行列互换之后得到的矩阵,称为的转置矩阵
性质对于矩阵A, B和标量c转置有下列性质:转置是自身逆运算。转置是从m × n矩阵的向量空间到所有n × m矩阵的向量空间的线性映射。注意因子反转的次序。以此可推出方块矩阵A是可逆矩阵,当且仅当AT是可逆矩阵,在这种情况下有 (A−1)T = (AT)−1。相对容易的把这个结果扩展到矩阵相乘的一般情况,可得出 (ABC...XYZ)T = ZTYTXT...CTBTAT。标量的转置是同样的标量。矩阵的转置矩阵的行列式等于这个矩阵的行列式。两个纵列向量a和b的点积可计算为如果A只有实数元素,则ATA是正半定矩阵。如果A是在某个域上,则A 相似于AT。