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

来源:互联网 发布:js方法同步执行 编辑:程序博客网 时间:2024/06/01 09:06

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

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

当然用到现在也没发现什么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
原创粉丝点击