新浪博客

C/C++实现应用矩阵初等变换的方法求逆矩阵

2012-12-06 15:35阅读:
//////////////////////////////////////////////////////////////////////////////////////////
//应用矩阵初等变换的方法求逆矩阵
//参数说明:
// 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;i<num;i++)
MatEnhanced[i] = (double*)malloc(2*num*sizeof(double));

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

double xishu=1;//初等变换时系数,设初值为1

for(i=0;i<num;i++) //增广矩阵赋值,前半部分
{
for(j=0;j<num;j++)
MatEnhanced[i][j] = naturalmat[i][j];
}
for(i=0;i<num;i++) //增广矩阵赋值,后半部分
{
for(j=num;j<2*num;j++)
MatEnhanced[i][j] = 0;//先将后半部分全部赋值为0

MatEnhanced[i][i+num] = 1;//再将其对角线部分赋值为1
}

//接下来进行初等行变换
for(i=0;i<num;i++)
{
if(MatEnhanced[i][i] == 0)//如果前半部分的对角线上的元素为0此时进行行变换
{
if(i == num-1)//如果是最后一行那么说明该矩阵不可逆
return false;
//对第i行以后的各行进行判断找到第i个元素不为零的行并与第i行进行交换
for(j=i;j<num;j++)
{
if(MatEnhanced[j][i] != 0)
{
k = j;//记住该行的行号
break;//退出循环
}
}
//接下来对第i行和第k行进行交换
temp = MatEnhanced[k];//k
MatEnhanced[k] = MatEnhanced[i];
MatEnhanced[i] = temp;
}

//初等变换
for(j=0;j<num;j++)//对其他行的所有列进行计算
{
if(j != i)//本行不参与计算
{
if(MatEnhanced[j][i] != 0)//只有当其不为零时进行计算否则不计算
{
xishu = MatEnhanced[j][i]/MatEnhanced[i][i];
for(k=i;k<2*num;k++)//对后面的所有列进行计算

我的更多文章

下载客户端阅读体验更佳

APP专享