• 算法学习笔记1.1.3 矩阵的逆


    任务

    给一个矩阵,求它的逆。

    说明

    将原矩阵A和一个单位矩阵R做成大矩阵(A,E),用初等行变换将大矩阵中的A变为E,则得到(E,A^-1)的形式。

    接口

    void inverse(vector<double> A[], vector<double> C[], int N)
    

    复杂度:O(n^3)
    输入:

    • A 原矩阵
    • C 逆矩阵
    • N 矩阵的逆

    代码

    #include <iostream>
    #include <vector>
    #include <cmath>
    using namespace std;
    
    inline vector<double> operator * (vector<double> a, double b) {
        int N = a.size();
        vector<double> res(N, 0);
        for (int i = 0; i < N; i ++)
            res[i] = a[i] * b;
        return res;
    }
    inline vector<double> operator - (vector<double> a, vector<double> b) {
        int N = a.size();
        vector<double> res(N, 0);
        for (int i = 0; i < N; i ++)
            res[i] = a[i] - b[i];
        return res;
    }
    inline void inverse(vector<double> A[], vector<double> C[], int N) {
        for (int i = 0; i < N; i ++)
            C[i] = vector<double>(N, 0);
        for (int i = 0; i < N; i ++)
            C[i][i] = 1;
        for (int i = 0; i < N; i ++) {
            for (int j = 0; j < N; j ++)
                if (fabs(A[j][i]) > 0) {
                    swap(A[i], A[j]);
                    swap(C[i], C[j]);
                    break;
                }
            C[i] = C[i] * (1 / A[i][i]);
            A[i] = A[i] * (1 / A[i][i]);
            for (int j = 0; j < N; j ++)
                if (j != i && fabs(A[j][i]) > 0) {
                    C[j] = C[j] - C[i] * A[j][i];
                    A[j] = A[j] - A[i] * A[j][i];
                }
        }
    }
    
    // main for test
    int main() {
        vector<double> A[3];
        vector<double> C[3];
        for (int i = 0; i < 3; i ++) {
            A[i] = vector<double>(3, 0);
            A[i][i] = 3;
            C[i] = vector<double>(3, 0);
            C[i][i] = 1;
        }
        inverse(A, C, 3);
        cout << "result:" << endl;
        for (int i = 0; i < 3; i ++) {
            for (int j = 0; j < 3; j ++) {
                cout << "	" << C[i][j];
            }
            cout << endl;
        }
        return 0;
    }
    /*
    output:
    result:
            0.333333        0       0
            0       0.333333        0
            0       0       0.333333
    
    */
    
  • 相关阅读:
    前端性能优化:Add Expires headers
    HTTP请求header信息讲解
    虚拟机的三种网络模式
    loadrunner中pacing设置01
    loadrunner中pacing的设置
    mysql安全策略
    Linux安装配置apache
    同步加载、异步加载、延迟加载
    monitorix(linux)系统和网络监控公工具
    HTTP与HTTPS对访问速度(性能)的影响
  • 原文地址:https://www.cnblogs.com/zifeiy/p/9513822.html
Copyright © 2020-2023  润新知