• 矩阵的逆矩阵,伴随矩阵


    #include<iostream> 
    #include<cstring>
    #include<cstdio>
    #include<algorithm>
    #include<iomanip>
    #include<sstream>
    #include<cmath>
    #include<regex>
    #define N 100
    using namespace std;
    
    template<typename out_type, typename in_value>
    
    out_type convert(const in_value & t){
        stringstream stream;
        stream<<t;//向流中传值
        out_type result;//这里存储转换结果
        stream>>result;//向result中写入值
        return result;
    }
    
    struct Number{
        int x, y;
        static int gcd(int a, int b){
            return b==0 ? a : gcd(b, a%b);
        }
        Number(){}
        Number(int xx, int yy=1):x(xx), y(yy){}
        Number operator /(Number tmp){
            return Number(x*tmp.y/(gcd(x*tmp.y, y*tmp.x)), y*tmp.x/gcd(x*tmp.y, y*tmp.x));
        } 
        
        Number operator *(Number tmp){
            return Number(x*tmp.x/gcd(x*tmp.x, y*tmp.y), y*tmp.y/gcd(x*tmp.x, y*tmp.y));
        }
        
        Number operator -(Number tmp){
            int lcm = y*tmp.y/gcd(y, tmp.y);//最小公倍数 
            int xx = lcm/y*x - lcm/tmp.y*tmp.x;
            if(xx==0)
                return Number(0, 1);
            return Number(xx/gcd(xx, lcm), lcm/gcd(xx, lcm));
        }
        
        bool operator ==(Number tmp){
            return x==tmp.x && y==tmp.y;
        }
    };
    
    
    ostream& operator<<(ostream& output, const Number &p){
        output<<setw(10)<<convert<string>(p.x)+"/"+convert<string>(p.y)<<" ";
    }
    
    struct Determinant{
        Number d[N][N];
        int n, m;
        Determinant(int nn, int mm): n(nn), m(mm){}
        
        void out_matrix(){
            for(int i=1; i<=n; ++i){
                for(int j=1; j<=m; ++j)
                    cout<<d[i][j];
                cout<<endl;
            }
        }
        
        void inverse_matrix_company(Number k){
            for(int i=1; i<=n; ++i)
                for(int j=1; j<=m; ++j)
                    d[i][j] = d[i][j]/k;
        } 
        
        bool exchangeRow(int mm, Number x[][N], int r){
            int row = r;
            for(int j=r+1; j<=n; ++j)
                if(!(x[j][r]==Number(0,1))){
                    row = j;
                    break;
                }
            if(row != r){//交换两行 
                for(int j=1; j<=mm; ++j){
                    Number tmp = x[r][j];
                    x[r][j] = x[row][j];
                    x[row][j] = tmp;
                }
                return true;
            }
            return false;
        }
         
        Number determinantValue(){
            if(n != m)
                return Number(0, 1);
            Number ans(1, 1);
            Number dd[N][N];
            for(int i=1; i<=n; ++i)
                for(int j=1; j<=m; ++j)
                    dd[i][j] = d[i][j];
            bool sign = true;
            for(int i=1; i<=n; ++i){
                for(int j=i+1; j<=n; ++j){
                    if(dd[i][i]==Number(0, 1)){
                        if(!exchangeRow(n, dd, i)) return Number(0, 1);
                        sign = !sign;
                    }
                    Number mul = dd[j][i]/dd[i][i];
                    for(int k=i; k<=n; ++k)
                        dd[j][k] = dd[j][k]-mul*dd[i][k];
                }
            }
            
            for(int i=1; i<=n; ++i)
                ans = ans*dd[i][i];
            if(!sign) ans.x = -ans.x;
            return ans;
        }
        Determinant inverse_matrix(){
            Determinant inverse(n, m);
            for(int i=1; i<=n; ++i){
                for(int j=1; j<=n; ++j)
                    inverse.d[i][j] = d[i][j];
                for(int j=n+1; j<=2*n; ++j)
                    inverse.d[i][j] =  j-i == n ? Number(1, 1) : Number(0, 1);
            }
             
            for(int i=1; i<=n; ++i){
                if(inverse.d[i][i]==Number(0,1))
                    exchangeRow(2*n, inverse.d, i);
                if(!(inverse.d[i][i]==Number(1,1))){
                    Number mul = Number(1,1)/inverse.d[i][i];
                    for(int j=i; j<=2*n; ++j)
                        inverse.d[i][j] = inverse.d[i][j]*mul;
                }
                for(int j=i-1; j>=1; --j){
                    if(inverse.d[j][i]==Number(0,1)) continue;
                    Number mul = inverse.d[j][i]/inverse.d[i][i];
                    for(int k=i; k<=2*n; ++k)
                        inverse.d[j][k] = inverse.d[j][k]-inverse.d[i][k]*mul;
                }
                for(int j=i+1; j<=n; ++j){
                    if(inverse.d[j][i]==Number(0,1)) continue;
                    Number mul = inverse.d[j][i]/inverse.d[i][i];
                    for(int k=i; k<=2*n; ++k)
                        inverse.d[j][k] = inverse.d[j][k]-inverse.d[i][k]*mul;
                }
            }
            
            for(int i=1; i<=n; ++i)
                for(int j=1; j<=m; ++j)
                    inverse.d[i][j] = inverse.d[i][j+n];
            return inverse;
        }
        
        Determinant company_matrix(){//伴随矩阵 
             Determinant company(n, m);
             for(int i=1; i<=n; ++i)
                 for(int j=1; j<=m; ++j){
                     Determinant tmp(n-1, m-1);//余子式 
                     int r=1, c=1;
                     for(int ii=1; ii<=n; ++ii){
                         c=1;
                         if(i!=ii){
                             for(int jj=1; jj<=m; ++jj)
                                 if(j!=jj){
                                     tmp.d[r][c] = d[ii][jj];
                                     ++c;
                                 }
                             ++r;
                         }
                    }
                    company.d[j][i] = tmp.determinantValue();//赋给伴随矩阵相应的位置
                    if((i+j)&1) company.d[j][i].x = -company.d[j][i].x;
                 }
            return company;
        }
    };
    
    int main(){
        int n, m;
        int x, y;
        cin>>n>>m; 
        Determinant determinant(n, m);
    //    regex patternOne("([a-z]+)\.([a-z]+)");
    //    smatch pieces_match;
        
        for(int i=1; i<=n; ++i){
            string str;
            for(int j=1; j<=n; ++j){
                scanf("%d/%d", &x, &y);
                determinant.d[i][j] = Number(x, y);
            }
        }
        //伴随矩阵 
        cout<<"伴随矩阵 "<<endl;
        Determinant company = determinant.company_matrix();    
        company.out_matrix();
        
        //行列式的值 
    //    cout<<determinant.determinantValue();
    //    cout<<endl;
        
        //逆置矩阵(通过伴随矩阵)
        cout<<"逆置矩阵(通过伴随矩阵)"<<endl;
        company.inverse_matrix_company(determinant.determinantValue());
        company.out_matrix();
        
        //逆置矩阵(初等行变换) 
        cout<<"逆置矩阵(初等行变换) "<<endl;
        Determinant inverse = determinant.inverse_matrix(); 
        inverse.out_matrix();
        cout<<endl;
        
        return 0;
    }
    /*
    3 3
    2/1 1/1 1/1
    1/1 2/1 1/1
    1/1 1/1 2/1
    
    3 3
    0/1 2/1 -1/1
    1/1 1/1 2/1
    -1/1 -1/1 -1/1
    
    5 5
    0/1 0/1 0/1 1/1 3/1
    0/1 0/1 0/1 -1/1 2/1
    1/1 1/1 1/1 0/1 0/1
    0/1 1/1 1/1 0/1 0/1
    0/1 0/1 1/1 0/1 0/1
    */
  • 相关阅读:
    Java笔记(十六)……内部类
    pmm系列~基础函数
    redis基础篇~性能问题
    redis基础篇~big-key
    mysql基础~经典题目二
    (转)STORM启动与部署TOPOLOGY
    (转)项目经理怎么当
    专注力的一点体会
    163源报错Hash Sum mismatch 解决方法
    mapreduce.framework.name
  • 原文地址:https://www.cnblogs.com/hujunzheng/p/4915472.html
Copyright © 2020-2023  润新知