矩阵转置的原理:行元素变成列元素,列元素变成行元素
例如:
矩阵转置代码
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<math.h>//矩阵转置
double** Matrix_T(double** arr)
{if(arr==NULL)exit(-1);int row = (int)_msize(arr) / (int)sizeof(double*);int col = (int)_msize(*arr) / (int)sizeof(double);double** T = (double**)malloc(sizeof(double*) * col);int i = 0;int j = 0;if (T != NULL){for (i = 0; i < col; i++){T[i] = (double*)malloc(sizeof(double) * row);}}for (i = 0; i < col; i++){for (j = 0; j < row; j++){T[i][j] = arr[j][i];}}return T;
}
上述代码中:
- 首先判断传入指针是否为空
- 然后判断矩阵的维数,这部分在C语言判断矩阵维数中有详细讲解
- 为转置后的矩阵开辟空间
- 进行矩阵装置,行列互换传参
上述方法使用的是malloc开辟的矩阵,该方法相对于用二维数组存储矩阵有以下几种优势:
1)函数传参时不用输入行列,只需传入指针
2)矩阵的大小可以未知,矩阵维数可以更改
3)不需要宏定义,程序可移植性高
malloc开辟矩阵的代码如下:
double** Make_Matrix(int row, int col)
{int i, j;double** arr = (double**)malloc(sizeof(double*) * row);if (arr != NULL){for (i = 0; i < row; i++){arr[i] = (double*)malloc(sizeof(double) * col);}}return arr;
}
该方法在C语言malloc开辟矩阵中有详细介绍。
测试:
为了方便测试,再加入初始化矩阵和打印矩阵两个函数
初始化函数
void Init_Matrix(double** arr)
{int i, j;int row = (int)_msize(arr) / (int)sizeof(double*);int col = (int)_msize(*arr) / (int)sizeof(double);for (i = 0; i < row; i++){for (j = 0; j < col; j++){arr[i][j] = pow(i,j);}}
}
为了更加直观,让每个元素等于 i 的 j 次方
打印函数
//打印矩阵
void print(double** arr)
{putchar('\n');int i, j, row, col;row = (int)_msize(arr) / (int)sizeof(double*);col = (int)_msize(*arr) / (int)sizeof(double);for (i = 0; i < row; i++){for (j = 0; j < col; j++){printf("%8.3lf ", arr[i][j]);}putchar('\n');}
}
主函数测试
int main()
{int i = 3;int j = 5;double** arr = Make_Matrix(i, j);Init_Matrix(arr);double** res = Matrix_T(arr);printf("原矩阵:>");print(arr);printf("逆矩阵:>");print(res);return 0;
}