逆矩阵及其矩阵线性一元方程的简单算法

我自己由于上线性代数,感觉逆矩阵是个很头痛的问题,所以以后就想偷个懒,每次在寝室做作业就可以直接使用电脑来帮忙了,这样会省下很多的功夫的,当然考试还是要自己做的!!!

废话不多说,上菜吧@-@

当然用到现在也没发现什么bug,如果你在使用的时候出现了bug,可以慢慢的自己调试修改下,如果可以的话,也可以和我qq联系,我们一起加油,欢迎你的访问。

#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <memory>
#include<cstring>
using namespace std;
int gcd(int a,int b){return b==0?a:gcd(b,a%b);}
struct Fraction//分数类
{
int molecular,denominator;//分别是分子和分母
    bool isLegal(){
    if(denominator==0)return false;
    return true;
    }
    bool operator==(int a){
    return molecular==a;
    }
    bool operator!=(int a){
    return !(molecular==a);
    }
    Fraction reciprocal(){//求分数的倒数
    Fraction f(*this);
    if(f.molecular==0)cout<<"分子是0,无法变成倒数"<<endl;
    f.molecular=f.molecular^f.denominator;
    f.denominator=f.molecular^f.denominator;
    f.molecular=f.molecular^f.denominator;


    return f;
    }
    Fraction(int m=1,int d=1)
    {
        molecular=m;
        denominator=d;
      simplify();
    }
    void simplify(){//分数化简
    int temp=1;
        while((temp=gcd(molecular,denominator))!=1)
        {
            molecular/=temp;
            denominator/=temp;
        }
    }
    Fraction operator/(Fraction f){
    Fraction d;
    d=f.reciprocal();
    return d*(*this);
    }
    Fraction operator/(int a){
    Fraction d;
    Fraction f(a,1);
    d=f.reciprocal();
    return d*(*this);
    }
    Fraction operator*(Fraction f){
    Fraction d(1,1);
    d.denominator=denominator*f.denominator;
    d.molecular=molecular*f.molecular;
    d.simplify();
    return d;
    }
    Fraction operator*(int a){
    Fraction d(1,1);
    Fraction f(a,1);
    d.denominator=denominator*f.denominator;
    d.molecular=molecular*f.molecular;
    d.simplify();
    return d;
    }
     Fraction operator+(Fraction f){
    Fraction d(0,1);
    d.denominator=denominator*f.denominator;
    d.molecular=molecular*f.denominator+denominator*f.molecular;
    d.simplify();
    return d;
    }
    Fraction operator+(int a){
    Fraction d(0,1);
    Fraction f(a,1);
    d.denominator=denominator*f.denominator;
    d.molecular=molecular*f.denominator+denominator*f.molecular;
    d.simplify();
    return d;
    }
    Fraction operator-(Fraction f){
    Fraction d(0,1);
    d.denominator=denominator*f.denominator;
    d.molecular=molecular*f.denominator-denominator*f.molecular;
    d.simplify();
    return d;
    }
    Fraction operator-(int a){
    Fraction f(a,1);
    Fraction d(0,1);
    d.denominator=denominator*f.denominator;
    d.molecular=molecular*f.denominator-denominator*f.molecular;
    d.simplify();
    return d;
    }
};
istream&operator>>(istream&is,Fraction &f){//重载分数的输入函数
    int t;
    is>>t;
    f=Fraction(t,1);
    return is;
}
ostream&operator<<(ostream &os,Fraction f)//重载分数的输出函数;
{
//    os<<"该分数为-----------"<<endl;
//    os<<"该分数的分子和分母分别为"<<f.molecular<<"/"<<f.denominator<<endl;
    if(f.denominator<0){f.denominator=-f.denominator;f.molecular=-f.molecular;}
    if(f.isLegal())
    {
        os<<f.molecular;
    if(f.denominator!=1)
        os<<"/"<<f.denominator;
    }
    return os;
//    else os<<"该分数的分子和分母分别为"<<f.molecular<<"/"<<f.denominator<<endl;
//    os<<"-----------------------"<<endl;
}
Fraction a[50][50];
int row,col;
void E_divide(int n,Fraction num){//第n行的所有的数都除以一个分数num
for(int i=1;i<=(col<<1);i++)
    a[n][i]=a[n][i]/num;
}
void E_add(int n,int c){//第n行的所有的数都加上[对应的这一列的数除以第c行c列(对角线上的数)的数的倍数]乘以[对应的对角线上的数]的乘积,比如对角线上的数是2,第n行的那个数是3,那么第n行的数都减去(3/2)倍的第c行的所有的对应的数。
    for(int i=1;i<=row;i++)
    if(a[i][c]!=0){
        Fraction temp=(Fraction(1,1)/a[i][c]);
    for(int j=1;j<=(col<<1);j++)
        a[n][j]=a[n][j]+(temp*a[i][j]);
    }
}
void E_sub(int n,Fraction num){//第n行所有的数都减去分数num。
    for(int i=1;i<=(col<<1);i++)
        a[n][i]=a[n][i]-num;
}
void E_2(int n,int c){//
//    if(a[c][c]==0){E_sub(n,a[n][c]);return;}
    Fraction temp=(a[n][c]/a[c][c]);
    for(int i=1;i<=(col<<1);i++)
        a[n][i]=a[n][i]-(temp*a[c][i]);
}
int main()
{
//    int n,m;
//        Fraction f1(1,3),f2(3,2);
//        cout<<(f1.reciprocal())<<endl;
//        cout<<"f1"<<f1<<endl;
//        cout<<"f1-f2"<<f1-f2<<endl;
//        cout<<"f2-f1"<<f2-f1<<
//        "f1/f2"<<f1/f2<<
//        "f1*f2"<<f1*f2<<
       "f2/f1"<<f2/f1<<
//        "f2*f1"<<(f2*f1)<<endl;
    int T=1;
    while(true)
{
    cout<<"第"<<T++<<"组测试数据:"<<endl;
    cout<<"输入矩阵大小(行 列):";
    cin>>row>>col;
    memset(a,0,sizeof(a));
    cout<<"输入矩阵:"<<endl;
    for(int i=1;i<=row;i++)
    {
       for(int j=1;j<=col;j++)
          {
              cin>>a[i][j];
          }
    }
    cout<<"请问B是单位矩阵吗?(Y/N)"<<endl;
    int flag=0;
    char str[10];
    while(scanf("%s",str)!=EOF){
        if(!strcmp(str,"Y")){flag=1;break;}
        else if(!(strcmp(str,"N"))){flag=0;break;}
    }
    if(!flag)
    {
        for(int i=1;i<=row;i++)
            for(int j=col+1;j<=(col<<1);j++)
            cin>>a[i][j];
    }
    else
    {
        for(int i=1;i<=row;i++)
       //在原始矩阵右侧加上特征矩阵
       for(int j=col+1;j<=col*2;j++)
            a[i][j]=(j-i==col)?(Fraction(1,1)):(Fraction(0,1));
    }
    cout<<setiosflags(ios::fixed);
//    for(int i=1;i<=row;i++)
//    {
//        for(int j=1;j<=(col<<1);j++)
//       cout<<setprecision(4)<<a[i][j]<<'\t';
//        cout<<endl;
//    }
    for(int j=1;j<=col;j++)
    {
        for(int i=1;i<=row;i++)
        {
//            cout<<"i="<<i<<":"<<"j="<<j<<endl;
            if(a[i][j]==0&&i==j)E_add(i,j);
            if(i==j&&a[i][j]!=0&&a[i][j]!=1)E_divide(i,a[i][j]);
            if(a[i][j]!=0&&i!=j)
                E_2(i,j);
//            cout<<"-----------------------------------------------------------------"<<endl;
//             for(int i=1;i<=row;i++)
//            {
//        for(int j=1;j<=(col<<1);j++)
//        cout<<setprecision(4)<<a[i][j]<<'\t';
//        cout<<endl;
//            }
        }
    }
    for(int i=1;i<=row;i++)
    {
       for(int j=col+1;j<=col*2;j++)
          cout<<setprecision(4)<<a[i][j]<<'\t';
       cout<<endl;
    }
}
    system("pause");
    return 0;
}
//
//0 0 1 0
//0 2 0 0
//3 0 0 0
//0 0 0 4






//1 0 0
//2 -1 0
//2 1 1


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 逆矩阵不仅可以用来求解矩阵方程(线性方程组),还有其他许多应用。 1. 矩阵的行列式: 行列式是一个关于矩阵的标量,可以用来描述矩阵的性质。逆矩阵的存在性和矩阵的行列式密切相关,当且仅当矩阵的行列式不为零时,矩阵才有逆矩阵。 2. 线性变换的求逆: 在线性变换中,逆矩阵可以用来描述一个变换的逆变换。如果一个线性变换可以表示为一个矩阵,那么该矩阵逆矩阵就可以用来求解该变换的逆变换。 3. 优化问题的求解: 在优化问题中,逆矩阵可以用来求解最小二乘问题。例如,在回归分析中,逆矩阵可以用来求解最小二乘法的系数。 4. 物理学中的应用: 逆矩阵在物理学中也有广泛的应用。例如,在量子力学中,矩阵的乘积和逆矩阵可以用来描述系统的演化和量子态之间的转换。 总之,逆矩阵在数学、物理学、工程学等领域都有广泛的应用。 ### 回答2: 逆矩阵不仅可以用来求解矩阵方程(线性方程组),还有其他的应用。 首先,逆矩阵的计算是一种重要的线性代数运算,可以通过高斯-约当消元法或者伴随矩阵法等方法来计算。逆矩阵的计算主要用于求解线性方程组,通过求解逆矩阵可以得到线性方程组的唯一解。 其次,在数值分析和数值计算领域,逆矩阵也有广泛的应用。在求解求逆问题时,逆矩阵可以用于求解线性方程组中的系数矩阵,以及在优化问题中的牛顿法等算法中的迭代过程。 此外,在统计学中,逆矩阵被广泛应用于多元回归分析和线性模型的参数估计。逆矩阵可以用于求解回归系数和预测未知结果,通过求逆矩阵计算出的结果可以进行参数估计和模型预测。 同时,逆矩阵还在图像处理、信号处理和通信系统等领域有重要的应用。在图像处理中,逆矩阵可以用于图像的去噪、图像的变换和图像的重构等方面。在信号处理和通信系统中,逆矩阵可以用于信号的滤波和通信信号的解调等方面。 综上所述,逆矩阵不仅可以用来求解矩阵方程(线性方程组),还有其他广泛的应用。逆矩阵的计算和应用在许多领域都起到了重要的作用。 ### 回答3: 逆矩阵是一种特殊的矩阵,它与原矩阵相乘后得到单位矩阵逆矩阵确实常用于求解矩阵方程或线性方程组,这是逆矩阵的经典应用。 然而,逆矩阵还有其他重要的应用。一种常见的应用是求解线性最小二乘问题。当我们需要找到一组参数,使得一个线性方程组的误差最小化时,可以使用逆矩阵来求解最优参数。 逆矩阵还被广泛应用于解析几何学、图像处理、统计学等领域。例如,在解析几何学中,逆矩阵可以用来求解变换矩阵,从而实现对平移、旋转、缩放等变换的计算。 此外,逆矩阵还可用于求解差分方程、微分方程以及其他数值计算问题。在差分方程和微分方程的求解过程中,可以利用逆矩阵来推导和求解。 另外,逆矩阵还具有计算机科学中的一些重要应用。比如在数据挖掘和机器学习中,逆矩阵可以用来进行特征选择、降维和参数估计等任务。 总结来说,逆矩阵不仅可以用来求解矩阵方程或线性方程组,还有很多其他的应用。它在数学、科学和工程领域都扮演着重要的角色,并为许多问题的求解提供了有效的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值