计算矩阵的逆矩阵

本文介绍了一个使用C++实现的程序,该程序能够计算三阶方阵的行列式值,并通过高斯消元法求解其逆矩阵。程序首先接收用户输入的系数,然后采用部分选择法寻找主元并进行行交换,最后利用回代法得到单位矩阵及相应的逆矩阵。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>
#include <iomanip>
using namespace std;
 
const int n=3;          //设置方程组的维
 
void input_data(float a[n][2*n])      //输入行列式的相关数据
{  
    cout<<"输入要计算的行列式a["<<n<<"]["<<n<<"]:"<<endl;
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            cin>>a[i][j];
    for(i=0;i<n;i++)
        for(int j=n;j<2*n;j++)
            if(i==j-n)
                a[i][j]=1;
            else
                a[i][j]=0;
    system("cls");
}
//////////////////////////////////////////////////////////////////
//
//find_line():找出行(i,,,n)、列为i的最大主元素所在的行,并返回行值
//
//////////////////////////////////////////////////////////////////
int find_line(int i,float a[n][2*n])
{
    int max_a_line=i;               //max_a_line为最大元素所在的行
    float max_a=a[i][i];            //max_a为最大元素的值
    int out_i=i;                      //out_i为i的初始值
    for(i=i+1;i<n;i++)
    {
        if(a[i][out_i]<0)
            if(max_a<-a[i][out_i])
            {
                max_a=-a[i][out_i];
                max_a_line=i;
            };
        if(max_a<a[i][out_i])
        {
            max_a=a[i][out_i];
            max_a_line=i;
        };
    }
    return max_a_line;
}
//////////////////////////////////////////////////////////////////
//
//chang_line():交换两行的从line列到n列的元素
//
//////////////////////////////////////////////////////////////////
void chang_line(int line,int other_line,float a[n][2*n])
{
    float m;                          //m为中间变量
    for(int j=line;j<2*n;j++)
    {
        m=a[line][j];
        a[line][j]=a[other_line][j];
        a[other_line][j]=m;
    }
}
 
//////////////////////////////////////////////////////////////////
//
//clear_num_down():消去第i列、i行以下的元素
//
//////////////////////////////////////////////////////////////////
void clear_num_down(int i,float a[n][2*n])
{
    int line=i,j;
    float m;
    for(i=i+1;i<n;i++)
    {
        m=-a[i][line]/a[line][line];
        for(j=line;j<2*n;j++)
        {
            a[i][j]=a[i][j]+m*a[line][j];
        };
    }
}
//////////////////////////////////////////////////////////////////
//
//clear_num_up():消去第i列、i行以上的元素
//
//////////////////////////////////////////////////////////////////
void clear_num_up(int i,float a[n][2*n])
{
    int line=i,j;
    float m;
    for(i=i-1;i>=0;i--)
    {
        m=-a[i][line]/a[line][line];
        for(j=line;j<2*n;j++)
        {
            a[i][j]=a[i][j]+m*a[line][j];
        };
    }
}
//////////////////////////////////////////////////////////////////
//
//calculate_det():计算行列式的值
//
//////////////////////////////////////////////////////////////////
float calculate_det(float a[n][2*n])
{
    float det=1;
    int i=0,j; 
    do{                                //消去第i列、i行以下的元素
        if(a[i][i]==0)
        {
            j=find_line(i,a);
            if(i!=j)
            {
                chang_line(i,j,a);
                det=-det;
            };
        }
        if(a[i][i]==0)
            return 0;
        det=det*a[i][i];
        if(i<n-1)
            clear_num_down(i,a);
        i++;
    }while(i<n);
    i--;
    do{                                       //消去第i列、i行以上的元素          
        if(i>0)
        {
            clear_num_up(i,a);
        }
        i--;
    }while(i>0);
    i=0;
    do{
        if(a[i][i]!=1)
        {
            for(j=i+1;j<2*n;j++)
                a[i][j]=a[i][j]/a[i][i];
            a[i][i]=1;
        }      
        i++;
    }while(i<n);
    return det;
}
 
void main ()
{
    float a[n][2*n],det,b[n][n];
    input_data(a);
    cout << setiosflags(ios::fixed);   //和下一句结合起来用来设定小数位的位数
    cout << setprecision(6);
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            b[i][j]=a[i][j];
    det=calculate_det(a);
    cout<<"原矩阵为:"<<endl;
    for(i=0;i<n;i++)
    {
        cout<<"┃ ";
        for(int j=0;j<n;j++)
            cout<<b[i][j]<<"   ";      
        cout<<"┃"<<endl;
    };
    cout<<"矩阵的行列式值为:"<<det<<endl;
    cout<<endl<<endl<<"原矩阵的逆矩阵为:"<<endl;
    for(i=0;i<n;i++)
    {
        cout<<"┃ ";      
        for(int j=n;j<2*n;j++)
            cout<<a[i][j]<<" ";
        cout<<"┃"<<endl;
    };
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zxg623

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值