写一个求逆矩阵的c语言代码
以下是一个用C语言编写的求逆矩阵的示例代码:
#include <stdio.h>
#define N 3
// 交换两行
void swapRows(double matrix[N][N], int r1, int r2) {
for (int i = 0; i < N; i++) {
double temp = matrix[r1][i];
matrix[r1][i] = matrix[r2][i];
matrix[r2][i] = temp;
}
}
// 将某一行的元素乘以一个非零标量
void scaleRow(double matrix[N][N], int r, double scalar) {
for (int i = 0; i < N; i++) {
matrix[r][i] *= scalar;
}
}
// 将某一行的元素乘以一个非零标量后加到另一行上
void addScaledRow(double matrix[N][N], int r1, int r2, double scalar) {
for (int i = 0; i < N; i++) {
matrix[r2][i] += scalar * matrix[r1][i];
}
}
// 求逆矩阵
void inverseMatrix(double matrix[N][N], double inverse[N][N]) {
// 初始化逆矩阵为单位矩阵
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (i == j) {
inverse[i][j] = 1.0;
} else {
inverse[i][j] = 0.0;
}
}
}
// 初等行变换
for (int i = 0; i < N; i++) {
// 如果当前列的对角元素为0,则交换行
if (matrix[i][i] == 0.0) {
int r;
for (r = i + 1; r < N; r++) {
if (matrix[r][i] != 0.0) {
break;
}
}
if (r == N) {
printf("矩阵不可逆。\n");
return;
}
swapRows(matrix, i, r);
swapRows(inverse, i, r);
}
// 将对角元素调整为1
double scalar = 1 / matrix[i][i];
scaleRow(matrix, i, scalar);
scaleRow(inverse, i, scalar);
// 将其他行的元素消为0
for (int r = 0; r < N; r++) {
if (r != i) {
scalar = -matrix[r][i];
addScaledRow(matrix, i, r, scalar);
addScaledRow(inverse, i, r, scalar);
}
}
}
}
// 打印矩阵
void printMatrix(double matrix[N][N]) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
printf("%.2f ", matrix[i][j]);
}
printf("\n");
}
}
int main() {
double matrix[N][N] = {{2, -1, 0},
{-1, 2, -1},
{0, -1, 2}};
double inverse[N][N];
inverseMatrix(matrix, inverse);
printf("原矩阵:\n");
printMatrix(matrix);
printf("逆矩阵:\n");
printMatrix(inverse);
return 0;
}
该代码使用了高斯-约旦消元法来求解逆矩阵。在 inverseMatrix 函数中,首先将逆矩阵初始化为单位矩阵,然后进行初等行变换,将原矩阵转换为上三角矩阵,并将逆矩阵相应地进行相同的行变换。最后,将上三角矩阵转换为对角矩阵,得到逆矩阵。在进行初等行变换时,如果当前列的对角元素为0,则交换行,以避免除以0的错误。如果无法找到非零元素进行交换,则矩阵不可逆
原文地址: https://www.cveoy.top/t/topic/inCB 著作权归作者所有。请勿转载和采集!