C语言矩阵求逆

采用高斯消去法求逆

直接上代码

void Matrix_inverse(double arc[6][6], int n, double ans[6][6])//计算矩阵的逆
{
	int i, j, k;//列
	double max, tempA, tempB, P;
	int max_num;
	double arcs[6][6];
	memcpy(arcs, arc, 288);
	for (i = 0; i < n; i++)
	{
		ans[i][i] = 1;
	}
	for (i = 0; i < n; i++)//第i列
	{
		max = fabs(arcs[i][i]);
		max_num = i;
		for (j = i + 1; j < n; j++)//选出主元
		{
			if (fabs(arcs[j][i]) > max)
			{
				max = fabs(arcs[j][i]);
				max_num = j;
			}
		}
		/*if (max == 0)
		{
			printf("i can't");
			break;
		}*/
		for (k = 0; k < n; k++)//交换行
		{
			tempA = arcs[i][k];
			arcs[i][k] = arcs[max_num][k];
			arcs[max_num][k] = tempA;
			tempB = ans[i][k];
			ans[i][k] = ans[max_num][k];
			ans[max_num][k] = tempB;
		}
		for (k = i + 1; k < n; k++)
		{
			P = arcs[k][i] / arcs[i][i];
			for (j = 0; j < n; j++)
			{
				arcs[k][j] = arcs[k][j] - arcs[i][j] * P;
				ans[k][j] = ans[k][j] - ans[i][j] * P;
			}
		}
	}
	for (i = 0; i < n; i++)//行
	{
		P = arcs[i][i];
		for (j = i; j < n; j++)
		{
			arcs[i][j] = arcs[i][j] / P;
		}
		for (j = 0; j < n; j++)
		{
			ans[i][j] = ans[i][j] / P;
		}
	}
	for (i = n - 1; i > 0; i--)
	{
		for (j = i - 1; j >= 0; j--)
		{
			for (k = 0; k < n; k++)
			{
				ans[j][k] = ans[j][k] - ans[i][k] * arcs[j][i];
			}
		}
	}
}

我写的是针对6x6矩阵的,有需要的话,把6改成其他数字就好了

  • 6
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
矩阵求逆是一个比较复杂的数学问题,需要使用高级的数学算法。在C语言中,可以使用第三方库来实现矩阵求逆的功能。 一个比较常用的矩阵求逆的库是LAPACK(Linear Algebra Package),它提供了一系列的线性代数运算函数。使用LAPACK库可以比较方便地实现矩阵求逆的功能。 下面是一个使用LAPACK库实现矩阵求逆的示例代码: ```c #include <stdio.h> #include <lapacke.h> void print_matrix(int m, int n, double *a, int lda) { int i, j; for (i = 0; i < m; i++) { for (j = 0; j < n; j++) { printf("%lf ", a[i * lda + j]); } printf("\n"); } } int main() { double a[9] = {1, 2, 3, 4, 5, 6, 7, 8, 10}; int n = 3, lda = 3, ipiv[3], info; // 打印原始矩阵 printf("原始矩阵:\n"); print_matrix(n, n, a, lda); // 计算矩阵的LU分解 info = LAPACKE_dgetrf(LAPACK_ROW_MAJOR, n, n, a, lda, ipiv); if (info != 0) { printf("计算LU分解失败!\n"); return -1; } // 计算矩阵 info = LAPACKE_dgetri(LAPACK_ROW_MAJOR, n, a, lda, ipiv); if (info != 0) { printf("计算矩阵失败!\n"); return -1; } // 打印矩阵 printf("矩阵:\n"); print_matrix(n, n, a, lda); return 0; } ``` 在上面的代码中,我们首先定义了一个3x3的矩阵a,然后通过LAPACK库中的dgetrf和dgetri函数来计算矩阵的LU分解和矩阵。最后打印出计算得到的矩阵。 需要注意的是,使用LAPACK库需要在编译时链接相应的库文件。在Linux系统中,可以使用以下命令来编译上面的代码: ```bash gcc -o matrix_inverse matrix_inverse.c -llapacke -llapack -lblas -lm ``` 其中,-llapacke,-llapack,-lblas,-lm分别表示链接LAPACK库、BLAS库和数学库。在Windows系统中,链接方式可能略有不同,需要根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值