C语言求矩阵的逆矩阵Word文件下载.docx
- 文档编号:22874602
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:9
- 大小:60.92KB
C语言求矩阵的逆矩阵Word文件下载.docx
《C语言求矩阵的逆矩阵Word文件下载.docx》由会员分享,可在线阅读,更多相关《C语言求矩阵的逆矩阵Word文件下载.docx(9页珍藏版)》请在冰豆网上搜索。
#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)
k
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;
//返回
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 矩阵