求逆矩阵的C++程序Word格式.docx

上传人:b****2 文档编号:5586894 上传时间:2023-05-05 格式:DOCX 页数:11 大小:16.08KB
下载 相关 举报
求逆矩阵的C++程序Word格式.docx_第1页
第1页 / 共11页
求逆矩阵的C++程序Word格式.docx_第2页
第2页 / 共11页
求逆矩阵的C++程序Word格式.docx_第3页
第3页 / 共11页
求逆矩阵的C++程序Word格式.docx_第4页
第4页 / 共11页
求逆矩阵的C++程序Word格式.docx_第5页
第5页 / 共11页
求逆矩阵的C++程序Word格式.docx_第6页
第6页 / 共11页
求逆矩阵的C++程序Word格式.docx_第7页
第7页 / 共11页
求逆矩阵的C++程序Word格式.docx_第8页
第8页 / 共11页
求逆矩阵的C++程序Word格式.docx_第9页
第9页 / 共11页
求逆矩阵的C++程序Word格式.docx_第10页
第10页 / 共11页
求逆矩阵的C++程序Word格式.docx_第11页
第11页 / 共11页
亲,该文档总共11页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

求逆矩阵的C++程序Word格式.docx

《求逆矩阵的C++程序Word格式.docx》由会员分享,可在线阅读,更多相关《求逆矩阵的C++程序Word格式.docx(11页珍藏版)》请在冰点文库上搜索。

求逆矩阵的C++程序Word格式.docx

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;

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

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2