• 高斯消元法求逆矩阵


    有多组测试数据。每组测试数据先输入一个整数n,表示方阵的阶。然后下面输入n阶方阵。输出其逆矩阵。若无逆矩阵,则输出No inverse matrix。

    #include <iostream>
    #include <cmath>
    #include <algorithm>
    
    using namespace std;
    
    const double eps = 1e-6;
    
    bool is_zero( const double num )
    {
        return fabs(num) < eps;
    }
    
    void create( double ** & matrix, const int n )
    {
        matrix = new double* [n];
        for ( int i = 0; i < n; ++i )
            matrix[i] = new double[n];
    }
    
    void input ( double ** matrix, const int n )
    {
        for ( int i = 0; i < n; ++i )
        {
            for ( int j  = 0; j < n; ++ j )
                cin >> matrix[i][j];
        }
    }
    
    bool inverse ( double ** matrix1, double ** matrix2, const int n )
    {
        int i, j;
        for ( i = 0; i < n; ++ i )
        {
            for ( j = 0; j < n; ++ j )
            {
                if ( i == j )
                    matrix2[i][j] = 1;
                else
                    matrix2[i][j] = 0;
            }
        }
        for ( i = 0; i < n; ++i )
        {
            int rowmaxpos = i;
            for ( j = i + 1; j < n; ++j )
            {
                if ( matrix1[i][j] > matrix1[i][rowmaxpos] )
                    rowmaxpos = j;
            }
            for ( j = i; j < n; ++ j )
            {
                swap( matrix1[j][rowmaxpos], matrix1[j][i]);
                swap( matrix2[j][rowmaxpos], matrix2[j][i]);
            }
            if ( !is_zero(matrix1[i][i]) )
            {
                int divisor = matrix1[i][i];
                for ( j = i; j < n; ++ j )
                {
                    matrix1[i][j] /= divisor;
                    matrix2[i][j] /= divisor;
                }
                for ( j = i + 1; j < n; ++ j )
                {
                    int multiple = matrix1[j][i];
                    for ( int k = i; k < n; ++ k )
                    {
                        matrix1[i][j] -= matrix1[i][k] * multiple;
                        matrix2[i][j] -= matrix2[i][k] * multiple;
                    }
                }
            }
            else
                return false;
        }
        return true;
    }
    
    void output( double ** matrix, const int n )
    {
        for ( int i = 0; i < n; ++i )
        {
            for ( int j = 0; j < n; ++ j )
                cout << matrix[i][j] << ' ';
            cout<<endl;
        }
    }
    
    void destroy( double ** matrix, const int n )
    {
        for ( int i = 0; i < n; ++ i )
            delete [] matrix[i];
        delete [] matrix;
    }
    
    int main()
    {
        int n;
        double ** matrix1;
        double ** matrix2;
        while ( cin >> n )
        {
            create( matrix1, n );
            create( matrix2, n );
            input( matrix1, n);
            if ( inverse(matrix1, matrix2, n) )
                output( matrix2, n );
            else
                cout << "No inverse matrix" << endl;
            destroy( matrix1, n );
            destroy( matrix2, n );
        }
        return 0;
    }
  • 相关阅读:
    Caffe--solver.prototxt配置文件 参数设置及含义
    关于KMP算法理解(快速字符串匹配)
    Lintcode--004(最小子串覆盖)
    Lintcode--003(乱序字符串)
    Lintcode--002(两个字符串是变位词)
    Lintcode--001(比较字符串)
    闭包的应用实例
    JavaScript完整性检查
    null和undefined相等比较
    JavaScript逻辑运算符(操作数运算符)
  • 原文地址:https://www.cnblogs.com/yejianfei/p/3481134.html
Copyright © 2020-2023  润新知