C语言求矩阵的逆矩阵Word文件下载.docx

上传人:b****8 文档编号:22874602 上传时间:2023-02-05 格式:DOCX 页数:9 大小:60.92KB
下载 相关 举报
C语言求矩阵的逆矩阵Word文件下载.docx_第1页
第1页 / 共9页
C语言求矩阵的逆矩阵Word文件下载.docx_第2页
第2页 / 共9页
C语言求矩阵的逆矩阵Word文件下载.docx_第3页
第3页 / 共9页
C语言求矩阵的逆矩阵Word文件下载.docx_第4页
第4页 / 共9页
C语言求矩阵的逆矩阵Word文件下载.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

C语言求矩阵的逆矩阵Word文件下载.docx

《C语言求矩阵的逆矩阵Word文件下载.docx》由会员分享,可在线阅读,更多相关《C语言求矩阵的逆矩阵Word文件下载.docx(9页珍藏版)》请在冰豆网上搜索。

C语言求矩阵的逆矩阵Word文件下载.docx

#defineN9//默认行列式最大输入阶数为9

floatFun(intn,floata[N][N]);

//定义行列式计算程序,n为行列式阶数,a为矩阵a

/*主程序*/

intmain(void)

{

intn;

//定义阶数n

inti,j,i1,j1,i2,j2;

//定义循环变量

floata[N][N],b[N][N],c[N][N];

//定义数组,a为原始录入数组,b为中间变量数组,用于提取与计算余子式,c为输出结果数组

floatd;

//定义a的行列式值

printf("

Inputtheorderofmatrixa:

"

);

//输入a的阶数

scanf("

%d"

&

n);

Inputmatrixa:

\n"

//输入矩阵a

for(i=0;

i<

n;

i++)

{

for(j=0;

j<

j++)

{

scanf("

%f"

&

a[i][j]);

}

}

d=Fun(n,a);

//计算a的行列式

if(fabs(d)<

1e-6)//判断a的行列式值是否为0

printf("

Thedeterminantisnotinvertible!

//输出“行列式值为0,不可逆”

else

Thedeterminantofais%f"

d);

//非0继续运算

if(n==1)//阶数为1的情况

{

c[0][0]=1/d;

}

else//阶数大于1的情况

for(i=0;

=n-1;

i++)

for(j=0;

=n-1;

{

for(i1=0,i2=0;

i2<

n-1;

i1++,i2++)

{

for(j1=0,j2=0;

j2<

j1++,j2++)

{

if(i1==i)

{

i1++;

}

if(j1==j)

j1++;

b[i2][j2]=a[i1][j1];

//提取a[i][j]所对应的余子式到矩阵b中

}

}

c[j][i]=pow(-1,i+j)*Fun(n-1,b)/d;

//计算a[i][j]对应的代数余子式,存入矩阵c中并完成转置

}

}

//输出结果

for(i=0;

i<

n;

i++)

for(j=0;

j<

j++)

printf("

%10f"

c[i][j]);

printf("

}

/*求行列式*/

floatFun(intn,floata[N][N])//定义求矩阵行列式的程序,采用逐步降阶求值

floatb[N][N];

//定义矩阵b

inti=0,j=0;

//定义循环变量i,j

floatsum=0;

//定义行列式运算结果sum

intc=0,p=0;

//定义辅助变量c,p

if(n==1)//行列式阶数为1函数直接返回a[0][0]值

returna[0][0];

for(i=0;

i<

i++)//针对行列式第一列展开

for(c=0;

c<

n-1;

c++)

for(j=0;

j<

if(c<

i)//判断录入数组b时行数值,如果c大于i,则在执行录入数组a时行数下移一行,否则不执行数+1的操作

{

p=0;

p=1;

b[c][j]=a[c+p][j+1];

//取出a[i][j]第一列每个元素对应的余子式存入数组b中

sum+=a[i][0]*Fun(n-1,b)*pow(-1,i);

//求出a第一列每个元素代数余子式之和,其中嵌套Fun进行逐步降阶完成高阶行列式计算

returnsum;

方法二:

用行初等变换来求矩阵的逆

//应用矩阵初等变换的方法求逆矩阵

//参数说明:

// 

naturalmat 

原矩阵

num 

矩阵的阶数

InvMat 

求解结果,逆矩阵

bool 

Matrix_Inv(double 

**naturalmat,int 

num,double 

**InvMat)

int 

i,j,k;

double 

**MatEnhanced;

//增广矩阵(A|E)

MatEnhanced 

(double**)malloc(num*sizeof(double*));

for(i=0;

num;

MatEnhanced[i] 

(double*)malloc(2*num*sizeof(double));

*temp;

temp 

xishu=1;

//初等变换时系数,设初值为1

i++) 

//增广矩阵赋值,前半部分

for(j=0;

MatEnhanced[i][j] 

naturalmat[i][j];

//增广矩阵赋值,后半部分

for(j=num;

2*num;

0;

//先将后半部分全部赋值为0

MatEnhanced[i][i+num] 

1;

//再将其对角线部分赋值为1

//接下来进行初等行变换

if(MatEnhanced[i][i] 

== 

0)//如果前半部分的对角线上的元素为0,此时进行行变换

if(i 

num-1)//如果是最后一行,那么说明该矩阵不可

return 

false;

//对第i行以后的各行进行判断,找到第i个元素不为零的行,并与第i行进行交换

for(j=i;

if(MatEnhanced[j][i] 

!

0)

j;

//记住该行的行号

 

break;

//退出循环

//接下来对第i行和第k行进行交换

MatEnhanced[k];

//第k行

MatEnhanced[k] 

MatEnhanced[i];

temp;

//初等变换

j++)//对其他行的所有列进行计算

if(j 

i)//本行不参与计算

0)//只有当其不为零时进行计算,否则不计算

xishu 

MatEnhanced[j][i]/MatEnhanced[i][i];

for(k=i;

k<

k++)//对后面的所有列进行计算

MatEnhanced[j][k] 

-= 

xishu*MatEnhanced[i][k];

//将本行所有列都除以对角线上的值,将前半部分化成单位矩阵

MatEnhanced[i][i];

if(xishu 

/= 

xishu;

//计算完成后,后半部分即为原矩阵的逆矩阵,将其赋值给InvMat.

InvMat[i][j] 

MatEnhanced[i][j+num];

//内存释放

free(MatEnhanced);

free(temp);

true;

//返回

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

当前位置:首页 > 外语学习 > 法语学习

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1