求逆矩阵的C++程序.docx
- 文档编号:11930684
- 上传时间:2023-04-16
- 格式:DOCX
- 页数:11
- 大小:16.08KB
求逆矩阵的C++程序.docx
《求逆矩阵的C++程序.docx》由会员分享,可在线阅读,更多相关《求逆矩阵的C++程序.docx(11页珍藏版)》请在冰豆网上搜索。
求逆矩阵的C++程序
//*************************
//***求任何一个矩阵的逆***
//*************************
#include<>
#include<>
#include<>
#defineN10//定义方阵的最大阶数为10
//函数的声明部分
floatMatDet(float*p,intn);//求矩阵的行列式
floatCreat_M(float*p,intm,intn,intk);//求矩阵元素A(m,n)的代数余之式
voidprint(float*p,intn);//输出矩阵n*n
boolGauss(floatA[][N],floatB[][N],intn);//采用部分主元的高斯消去法求方阵A的逆矩阵B
intmain()
{
float*buffer,*p;//定义数组首地址指针变量
introw,num;//定义矩阵的行数和矩阵元素个数
inti,j;
floatdeterm;//定义矩阵的行列式
floata[N][N],b[N][N];
intn;
cout<<"采用逆矩阵的定义法求矩阵的逆矩阵!
\n";
cout<<"请输入矩阵的行数:
";
cin>>row;
num=2*row*row;
buffer=(float*)calloc(num,sizeof(float));//分配内存单元
p=buffer;
if(NULL!
=p)
{
for(i=0;i { cout<<"Pleaseinputthenumberof"< "; for(j=0;j { cin>>*p++; } } } else { cout<<"Can'tdistributememory\n"; } cout<<"Theoriginalmatrix: \n"; print(buffer,row);//打印该矩阵 determ=MatDet(buffer,row);//求整个矩阵的行列式 p=buffer+row*row; if(determ! =0) { cout<<"Thedeterminantofthematrixis"< for(i=0;i { for(j=0;j { *(p+j*row+i)=Creat_M(buffer,i,j,row)/determ; } } cout<<"Theinversematrixis: "< print(p,row);//打印该矩阵 } else { cout<<"Thedeterminantis0,andthereisnoinversematrix! \n"; } free(buffer);//释放内存空间 cout<<"采用部分主元的高斯消去法求方阵的逆矩阵! \n"; cout<<"请输入方阵的阶数: "; cin>>n; cout<<"请输入"< \n"; //输入一个n阶方阵 for(i=0;i { for(j=0;j { cin>>a[i][j]; } } //运用高斯消去法求该矩阵的逆矩阵并输出 if(Gauss(a,b,n)) { cout<<"该方阵的逆矩阵为: \n"; for(i=0;i { cout< for(j=0;j { cout< } cout< } } return0; } //---------------------------------- //功能: 求矩阵(n*n)的行列式 //入口参数: 矩阵的首地址,矩阵的行数 //返回值: 矩阵的行列式值 //---------------------------------- floatMatDet(float*p,intn) { intr,c,m; intlop=0; floatresult=0; floatmid=1; if(n! =1) { lop=(n==2)1: n;//控制求和循环次数,若为2阶,则循环1次,否则为n次 for(m=0;m { mid=1;//顺序求和,主对角线元素相乘之和 for(r=0,c=m;r { mid=mid*(*(p+r*n+c%n)); } result+=mid; } for(m=0;m { mid=1;//逆序相减,减去次对角线元素乘积 for(r=0,c=n-1-m+n;r { mid=mid*(*(p+r*n+c%n)); } result-=mid; } } else result=*p; returnresult; } //------------------------------------------------------ //功能: 求k*k矩阵中元素A(m,n)的代数余之式 //入口参数: k*k矩阵的首地址,矩阵元素A的下标m,n,矩阵行数k //返回值: k*k矩阵中元素A(m,n)的代数余之式 //------------------------------------------------------- floatCreat_M(float*p,intm,intn,intk) { intlen; inti,j; floatmid_result=0; intsign=1; float*p_creat,*p_mid; len=(k-1)*(k-1);//k阶矩阵的代数余之式为k-1阶矩阵 p_creat=(float*)calloc(len,sizeof(float));//分配内存单元 p_mid=p_creat; for(i=0;i { for(j=0;j { if(i! =m&&j! =n)//将除第i行和第j列外的所有元素存储到以p_mid为首地址的内存单元 { *p_mid++=*(p+i*k+j); } } } sign=(m+n)%2==01: -1;//代数余之式前面的正、负号 mid_result=(float)sign*MatDet(p_creat,k-1); free(p_creat); returnmid_result; } //---------------------- //功能: 打印n*n矩阵 //入口参数: n*n矩阵的首地址,矩阵的行数n //返回值: 无返回值 voidprint(float*p,intn) { inti,j; for(i=0;i { cout< for(j=0;j { cout< : right)<<*p++< } cout< } } //---------------------------------------------- //功能: 采用部分主元的高斯消去法求方阵A的逆矩阵B //入口参数: 输入方阵,输出方阵,方阵阶数 //返回值: trueorfalse //---------------------------------------------- boolGauss(floatA[][N],floatB[][N],intn) { inti,j,k; floatmax,temp; floatt[N][N];//临时矩阵 //将A矩阵存放在临时矩阵t[n][n]中 for(i=0;i { for(j=0;j { t[i][j]=A[i][j]; } } //初始化B矩阵为单位阵 for(i=0;i { for(j=0;j { B[i][j]=(i==j)(float)1: 0; } } for(i=0;i { //寻找主元 max=t[i][i]; k=i; for(j=i+1;j { if(fabs(t[j][i])>fabs(max)) { max=t[j][i]; k=j; } } //如果主元所在行不是第i行,进行行交换 if(k! =i) { for(j=0;j { temp=t[i][j]; t[i][j]=t[k][j]; t[k][j]=temp; //B伴随交换 temp=B[i][j]; B[i][j]=B[k][j]; B[k][j]=temp; } } //判断主元是否为0,若是,则矩阵A不是满秩矩阵,不存在逆矩阵 if(t[i][i]==0) { cout<<"Thereisnoinversematrix! "; returnfalse; } //消去A的第i列除去i行以外的各行元素 temp=t[i][i]; for(j=0;j { t[i][j]=t[i][j]/temp;//主对角线上的元素变为1 B[i][j]=B[i][j]/temp;//伴随计算 } for(j=0;j { if(j! =i)//不是第i行 { temp=t[j][i]; for(k=0;k { t[j][k]=t[j][k]-t[i][k]*temp; B[j][k]=B[j][k]-B[i][k]*temp; } } } } returntrue; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 矩阵 C+ 程序