对矩阵求逆的c语言代码
时间: 2023-06-15 19:08:29 浏览: 105
下面是一个使用高斯-约旦消元法来求解矩阵逆的 C 语言代码:
```c
#include <stdio.h>
#define N 3
void printMatrix(double mat[N][N*2])
{
for (int i = 0; i < N; i++) {
for (int j = 0; j < N*2; j++) {
printf("%f ", mat[i][j]);
}
printf("\n");
}
}
void swapRows(double mat[N][N*2], int i, int j)
{
for (int k = 0; k < N*2; k++) {
double temp = mat[i][k];
mat[i][k] = mat[j][k];
mat[j][k] = temp;
}
}
void divideRow(double mat[N][N*2], int i, double divisor)
{
for (int k = 0; k < N*2; k++) {
mat[i][k] /= divisor;
}
}
void subtractRows(double mat[N][N*2], int i, int j, double factor)
{
for (int k = 0; k < N*2; k++) {
mat[i][k] -= factor * mat[j][k];
}
}
int main()
{
double mat[N][N*2] = {
{1, 0, 0, 1, 0, 0},
{0, 1, 0, 0, 1, 0},
{0, 0, 1, 0, 0, 1}
};
printf("原矩阵:\n");
printMatrix(mat);
// 对角线上方的部分赋值为0
for (int i = 0; i < N; i++) {
for (int j = i+1; j < N; j++) {
double factor = mat[j][i] / mat[i][i];
subtractRows(mat, j, i, factor);
}
}
// 对角线上的元素变为1
for (int i = 0; i < N; i++) {
double divisor = mat[i][i];
divideRow(mat, i, divisor);
}
// 对角线下方的部分赋值为0
for (int i = N-1; i >= 0; i--) {
for (int j = i-1; j >= 0; j--) {
double factor = mat[j][i] / mat[i][i];
subtractRows(mat, j, i, factor);
}
}
// 提取逆矩阵
double inv[N][N];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
inv[i][j] = mat[i][j+N];
}
}
printf("逆矩阵:\n");
printMatrix(inv);
return 0;
}
```
说明:
- 矩阵的大小为 `N*N`;
- `printMatrix` 函数用于打印矩阵;
- `swapRows` 函数用于交换矩阵中的两行;
- `divideRow` 函数用于将矩阵中的一行除以一个数;
- `subtractRows` 函数用于将矩阵中的一行减去另一行的某个倍数;
- 主函数中的代码使用高斯-约旦消元法求解矩阵逆,并打印出原矩阵和逆矩阵。
阅读全文