初等变换法求逆矩阵C++实现

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

说明

1、该程序模拟初等变换法求逆矩阵的过程,但效率并不是最优的,仅供参考。

2、运行之前,请修改宏定义M和N的值,使之和增广矩阵(a E)的行数以及列数匹配。

3、推荐一个在线求逆矩阵的网站(应用数学家园),网站地址:

/computing/geninvbl.aspx

代码

/*

初等变换法求逆矩阵C++实现

by LDSD

2015/10/30

*/

#include

using namespace std;

#define N 8 //定义为增广后矩阵的列数,实际上,N=2*M

#define M 4 //定义为该矩阵的行数

void print(float a[][N],int start)//每行从start的位置输出

{

cout<<"—————————————————————————————"<

for(int i=0;i

{

for(int j=start;j

{

cout<

}

cout<

}

cout<<"—————————————————————————————"<

}

void exchange(float a[][N],int han1,int han2)

{

float tmp;

cout<<"\n\n交换第"<

for(int i=0;i

{

tmp=a[han1][i];

a[han1][i]=a[han2][i];

a[han2][i]=tmp;

}

}

int compare(float a[],float b[],int direction)

/*

1 0

2 3

0 2 4 5

如果第一行大于第二行,返回-1,进行交换

否则(第一行等于或小于第二行)

如果direction为1返回第一个可以做运算的位置,这里是2

如果direction为0返回-2,从而程序直接跳过去

*/

{

int j=0;

int a_local=0,b_local=0;

for(j=0;j

{

if(a[j]!=0)

{

a_local=j;

break;

}

}

for(j=0;j

{

if(b[j]!=0)

{

b_local=j;

break;

}

}

if(a_local==N||b_local==N)

return N;

else if((a_local>b_local)&&direction==0) return -1;

else if((a_local==b_local)&&direction==0) return b_local;

else if((a_local

else if((a_local

else if((a_local>=b_local)&&direction==1) return a_local;

}

int deal(float a[][N],int han1,int han2,int direction)

{

//返回的flag为1,则调用print函数

int flag=0;

int i=0,local=0;

float save1,save2,div_factor;

local=compare(a[han1],a[han2],direction);

if(local==N/2)

cout<<"这个矩阵行列式为0,不存在逆矩阵"<

else if(local==-1)

{

exchange(a,han1,han2);

flag=1;

}

else if(a[han1][local]!=0&&local!=-2)

{

save1=a[han2][local];

save2=a[han1][local];

div_factor=a[han2][local]/a[han1][local];

for(int k=0;k

{

a[han2][k]=a[han2][k]-a[han1][k]*save1/save2;

}

cout<<"\n\n第"<<1+han2<<"行减去"<

flag=1;

}

return flag;

}

void generator(float a[][N])

{

for(int i=0;i

a[i][M+i]=1;

}

int reverse(float a[][N])

{

int flag=0;

generator(a);//把一个单位矩阵补加到矩阵后面

for(int i=0;i

{

for(int j=i;j

{

flag=deal(a,i,j+1,0);

if(flag==1)

print(a,0);

else if(flag==2)

return 0;

}

}

for(int k=0;k

for(int m=k;m

{

flag=deal(a,m+1,k,1);

相关文档
最新文档