C语言矩阵求逆.docx

上传人:牧羊曲112 文档编号:3155297 上传时间:2023-03-11 格式:DOCX 页数:13 大小:38.43KB
返回 下载 相关 举报
C语言矩阵求逆.docx_第1页
第1页 / 共13页
C语言矩阵求逆.docx_第2页
第2页 / 共13页
C语言矩阵求逆.docx_第3页
第3页 / 共13页
C语言矩阵求逆.docx_第4页
第4页 / 共13页
C语言矩阵求逆.docx_第5页
第5页 / 共13页
亲,该文档总共13页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《C语言矩阵求逆.docx》由会员分享,可在线阅读,更多相关《C语言矩阵求逆.docx(13页珍藏版)》请在三一办公上搜索。

1、C语言矩阵求逆#include <stdio.h> #include <stdlib.h> double * MatrixOpp(double *A,int m,int n); /*矩阵求逆*/ double * MatrixInver(double *A,int m,int n); /*矩阵转置*/ double Surplus(double A,int m,int n); /*求矩阵行列式*/ double * MatrixOpp(double A,int m,int n) /*矩阵求逆*/ int i,j,x,y,k; double *SP=NULL,*AB=NULL,*

2、B=NULL,X,*C; SP=(double *)malloc(m*n*sizeof(double); AB=(double *)malloc(m*n*sizeof(double); B=(double *)malloc(m*n*sizeof(double); X=Surplus(A,m,n); X=1/X; for(i=0;i <m;i+) for(j=0;j <n;j+) for(k=0;k <m*n;k+) Bk=Ak; for(x=0;x <n;x+) Bi*n+x=0; for(y=0;y <m;y+) Bm*y+j=0; Bi*n+j=1; SPi*n+j=S

3、urplus(B,m,n); ABi*n+j=X*SPi*n+j; C=MatrixInver(AB,m,n); return C; double * MatrixInver(double A,int m,int n) /*矩阵转置*/ int i,j; double *B=NULL; B=(double *)malloc(m*n*sizeof(double); for(i=0;i <n;i+) for(j=0;j <m;j+) Bi*m+j=Aj*n+i; return B; double Surplus(double A,int m,int n) /*求矩阵行列式*/ int i,

4、j,k,p,r; double X,temp=1,temp1=1,s=0,s1=0; if(n=2) for(i=0;i <m;i+) for(j=0;j <n;j+) if(i+j)%2) temp1*=Ai*n+j; else temp*=Ai*n+j; X=temp-temp1; else for(k=0;k <n;k+) for(i=0,j=k;i <m,j <n;i+,j+) temp*=Ai*n+j; if(m-i) for(p=m-i,r=m-1;p> 0;p-,r-) temp*=Ar*n+p-1; s+=temp; temp=1; for(k=n-1;

5、k> =0;k-) for(i=0,j=k;i <m,j> =0;i+,j-) temp1*=Ai*n+j; if(m-i) for(p=m-1,r=i;r <m;p-,r+) temp1*=Ar*n+p; s1+=temp1; temp1=1; X=s-s1; return X; /* Test */ int main int i,j; double arr55, *result, *t=arr; for(i=0; i <5; i+) for(j=0; j <5; j+) scanf( %lf , &arrij); result=MatrixOpp(double *)

6、arr,5,5); /求逆 /*.其他操作,如显示结果*/ printf( nnThe result is:n ); for(i=0; i <5*5; i+) printf( %lft , *(result+i); if(i%5=4)printf( n ); free(result); system( PAUSE ); return 0; 自己写的矩阵类,这是头文件 #ifndef XXXXX #define XXXXX #define MAX_SIZE 4 #include <iostream> #include <math.h> using namespace std;

7、 double abs(double a); class CMatrix; class CVector; CVector operator+(CVector& a,CVector& b); /向量加法 CVector operator-(CVector& a,CVector& b);/向量减法 class CVector public: CVector; CVector(int); CVector(int,double *b); int _size; void diapaly; CVector& operator=(CVector& a); friend CVector operator*(C

8、Matrix &a,CVector &b);/矩阵乘以向量 friend void Eliminate(CMatrix m,CVector &b,CVector &solution); friend void JacobiIter(CMatrix m,CVector b,CVector &solution); friend CVector operator+(CVector& a,CVector& b); /向量加法 friend CVector operator-(CVector& a,CVector& b);/向量减法 CVector& operator+=(const CVector&

9、a); CVector& operator-=(const CVector& a); friend double Module(CVector );/向量的模 /CVector; private: int n; /the size double *value; ; double Module(CVector a);/向量的模 CMatrix operator+(CMatrix&,CMatrix&);/重载矩阵加法 CMatrix operator-(CMatrix &a,CMatrix &b); /矩阵减法 class CMatrix public: CMatrix; CMatrix(int,

10、int); CMatrix(int,int,double aMAX_SIZE); CMatrix(CMatrix &a); friend void Eliminate(CMatrix m,CVector &b,CVector &solution); friend void JacobiIter(CMatrix m,CVector b,CVector &solution); friend CMatrix operator+(CMatrix&a,CMatrix&b); friend CMatrix InvMatrix(CMatrix ); /矩阵求逆 friend CMatrix operator

11、*(CMatrix& a,CMatrix &b); /矩阵乘法 friend CMatrix operator-(CMatrix &a,CMatrix &b); /矩阵减法 friend CVector operator*(CMatrix& a,CVector &b);/矩阵乘以向量 CMatrix& operator=(const CMatrix&); CMatrix& operator+=(const CMatrix&); CMatrix& operator-=(const CMatrix&); bool IsDiag; /判断是否为对角矩阵 int Row; int Col; void

12、dispaly; int Rank; /返回矩阵的秩 double Abs; /求矩阵的行列式的值,并打印出一个上三角矩阵 private: int row; /行数 int col; /列数 double valueMAX_SIZEMAX_SIZE; /值 ; CMatrix InvMatrix(CMatrix ); /矩阵求逆 CMatrix operator*(CMatrix& a,CMatrix &b); /矩阵乘法 CVector operator*(CMatrix& a,CVector &b);/矩阵乘以向量 CMatrix operator-(CMatrix &a,CMatrix

13、 &b); /矩阵减法 void Eliminate(CMatrix m,CVector &b,CVector &solution); /选主元消元法 void JacobiIter(CMatrix m,CVector b,CVector &solution); /解方程组的Jacibi迭代法 #endif CMatrix InvMatrix(CMatrix a) /逆 if(a.Row <=0 | a.Col <=0) throw 矩阵输入错误!无法执行 ; if(a.Row!=a.Col) throw 非方阵,无法求逆! ; CMatrix rhs(a.Row,a.Col); in

14、t i,j,k,t; double ax,temp,s; int flow; for(i=0;i <a.Row;i+) /先单位化 for(j=0;j <a.Col;j+) rhs.valueij=0; rhs.valueii=1; for(k=0;k <a.Col;k+)/对于每一列 s=0; for(j=k;j <a.Row;j+)/选取最大的主元 if(abs(a.valuejk)> =s) s=abs(a.valuejk); flow=j; for(t=0;t <a.Col;t+) /交换k行和flow行 temp=a.valuekt; a.valuekt=a.

15、valueflowt; a.valueflowt=temp; temp=rhs.valuekt; rhs.valuekt=rhs.valueflowt; rhs.valueflowt=temp; for(i=k+1;i <a.Row;i+)/从k+1行开始消 ax=a.valueik/a.valuekk; for(t=0;t <a.Col;t+) a.valueit=a.valueit-ax*a.valuekt; rhs.valueit=rhs.valueit-ax*rhs.valuekt; /*得到一个上三角阵,下面将之化为对角阵* for(i=a.Row-2;i> =0;i-) for(j=i+1;j <a.Col;j+) ax=a.valueij/a.valuejj; for(t=0;t <a.Col;t+) a.valueit=a.valueit-ax*a.valuejt; rhs.valueit=rhs.valueit-ax*rhs.valuejt; for(i=0;i <a.Row;i+) for(j=0;j <a.Col;j+) rhs.valueij/=a.valueii; for(j=0;j <a.Col;j+) a.valueij/=a.valueii; return rhs;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号