求逆矩阵的C++程序Word格式.docx
《求逆矩阵的C++程序Word格式.docx》由会员分享,可在线阅读,更多相关《求逆矩阵的C++程序Word格式.docx(11页珍藏版)》请在冰点文库上搜索。
inti,j;
floatdeterm;
//定义矩阵的行列式
floata[N][N],b[N][N];
intn;
cout<
<
"
采用逆矩阵的定义法求矩阵的逆矩阵!
\n"
;
请输入矩阵的行数:
cin>
row;
num=2*row*row;
buffer=(float*)calloc(num,sizeof(float));
//分配内存单元
p=buffer;
if(NULL!
=p)
{
for(i=0;
i<
i++)
Pleaseinputthenumberof"
<
i+1<
row:
for(j=0;
j<
j++)
*p++;
}
else
Can'
tdistributememory\n"
Theoriginalmatrix:
\n"
print(buffer,row);
//打印该矩阵
determ=MatDet(buffer,row);
//求整个矩阵的行列式
p=buffer+row*row;
if(determ!
=0)
Thedeterminantofthematrixis"
determ<
endl;
i++)//求逆矩阵
*(p+j*row+i)=Creat_M(buffer,i,j,row)/determ;
Theinversematrixis:
print(p,row);
Thedeterminantis0,andthereisnoinversematrix!
free(buffer);
//释放内存空间
采用部分主元的高斯消去法求方阵的逆矩阵!
请输入方阵的阶数:
n;
请输入"
n<
阶方阵:
//输入一个n阶方阵
a[i][j];
//运用高斯消去法求该矩阵的逆矩阵并输出
if(Gauss(a,b,n))
该方阵的逆矩阵为:
setw(4);
b[i][j]<
setw(10);
}
return0;
}
//----------------------------------
//功能:
求矩阵(n*n)的行列式
//入口参数:
矩阵的首地址,矩阵的行数
//返回值:
矩阵的行列式值
floatMatDet(float*p,intn)
intr,c,m;
intlop=0;
floatresult=0;
floatmid=1;
if(n!
=1)
lop=(n==2)1:
//控制求和循环次数,若为2阶,则循环1次,否则为n次
for(m=0;
m<
lop;
m++)
mid=1;
//顺序求和,主对角线元素相乘之和
for(r=0,c=m;
r<
r++,c++)
mid=mid*(*(p+r*n+c%n));
result+=mid;
//逆序相减,减去次对角线元素乘积
for(r=0,c=n-1-m+n;
r++,c--)
result-=mid;
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;
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;
k;
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)
setiosflags(ios:
:
right)<
*p++<
//----------------------------------------------
采用部分主元的高斯消去法求方阵A的逆矩阵B
输入方阵,输出方阵,方阵阶数
trueorfalse
boolGauss(floatA[][N],floatB[][N],intn)
inti,j,k;
floatmax,temp;
floatt[N][N];
//临时矩阵
//将A矩阵存放在临时矩阵t[n][n]中
i++)
t[i][j]=A[i][j];
//初始化B矩阵为单位阵
B[i][j]=(i==j)(float)1:
0;
//寻找主元
max=t[i][i];
k=i;
for(j=i+1;
if(fabs(t[j][i])>
fabs(max))
max=t[j][i];
k=j;
//如果主元所在行不是第i行,进行行交换
if(k!
=i)
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)
Thereisnoinversematrix!
"
returnfalse;
//消去A的第i列除去i行以外的各行元素
temp=t[i][i];
t[i][j]=t[i][j]/temp;
//主对角线上的元素变为1
B[i][j]=B[i][j]/temp;
//伴随计算
j++)//第0行->
第n行
if(j!
=i)//不是第i行
temp=t[j][i];
for(k=0;
k<
k++)//第j行元素-i行元素*j列i行元素
t[j][k]=t[j][k]-t[i][k]*temp;
B[j][k]=B[j][k]-B[i][k]*temp;
returntrue;