P4783 【模板】矩阵求逆 高斯-约旦消元 求矩阵的逆

以上是我们算法的依据下面的是例题。我们用高斯-约旦消元把分块矩阵: A|E 中的A初等变化为E , 整体矩阵变为:输入右块矩阵即可。#include <bits/stdc++.h>using namespace std;typedef long long ll;const int M = 400+7;const int mod =1e9+7;int a[M][M<<1];ll qpow(ll a,ll b){ ll ans=1; wh...
摘要由CSDN通过智能技术生成

以上是我们算法的依据

下面的是例题。

我们用高斯-约旦消元把分块矩阵: A|E  中的A初等变化为E ,  整体矩阵变为: E|A^ {-1}

输入右块矩阵即可。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int M = 400+7;
const int mod =1e9+7;
int a[M][M<<1];
ll qpow(ll a,ll b)
{
	ll ans=1;
	while(b)
	{
		if(b&1)ans=ans*a%mod;
		a=a*a%mod;
		b>>=1;
	}
	return ans;
}
//返回自由元个数,及无穷解个数 
bool Gauss(int n,int m)//对矩阵a高斯消元得到(E|C) C为等式右边的列矩阵 
{
	int row;//当前处理的行
	int col;//当前处理的列 
  	for(row=1,col=1;row<=n&&co
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个基于高斯-约旦消元法的矩阵求逆的C语言程序。程序中使用了随机矩阵和给定的数组来测试算法的正确性。 ```c #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 5 // 矩阵的大小 // 打印矩阵 void print_matrix(double **A, int n) { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { printf("%f ", A[i][j]); } printf("\n"); } } // 高斯-约旦消元法求矩阵 void invert(double **A, double **B, int n) { // 初始化单位矩阵 for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { B[i][j] = (i == j) ? 1.0 : 0.0; } } // 逐列消元 for (int k = 0; k < n; k++) { double pivot = A[k][k]; for (int j = 0; j < n; j++) { A[k][j] /= pivot; B[k][j] /= pivot; } for (int i = 0; i < n; i++) { if (i != k) { double factor = A[i][k]; for (int j = 0; j < n; j++) { A[i][j] -= factor * A[k][j]; B[i][j] -= factor * B[k][j]; } } } } } int main() { double **A = malloc(N * sizeof(double *)); double **B = malloc(N * sizeof(double *)); double *arr = malloc(N * N * sizeof(double)); // 用于存储随机矩阵 srand(time(NULL)); // 用系统时间初始化随机数生成器 // 初始化随机矩阵和数组 for (int i = 0; i < N; i++) { A[i] = malloc(N * sizeof(double)); B[i] = malloc(N * sizeof(double)); for (int j = 0; j < N; j++) { arr[i * N + j] = rand() % 10 + 1; // 生成1~10之间的随机数 A[i][j] = arr[i * N + j]; } } printf("随机矩阵为:\n"); print_matrix(A, N); invert(A, B, N); printf("矩阵为:\n"); print_matrix(B, N); // 检查矩阵是否正确 for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { double sum = 0.0; for (int k = 0; k < N; k++) { sum += A[i][k] * B[k][j]; } if (i == j && abs(sum - 1.0) > 1e-6) { printf("矩阵有误!\n"); break; } if (i != j && abs(sum) > 1e-6) { printf("矩阵有误!\n"); break; } } } // 释放内存 free(arr); for (int i = 0; i < N; i++) { free(A[i]); free(B[i]); } free(A); free(B); return 0; } ``` 注意:由于本程序使用了动态内存分配,因此必须在程序结束时手动释放内存,否则会导致内存泄漏。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值