求逆矩阵(C++)

求矩阵的逆常见的一般有三种方法(考研常见):待定系数法、高斯-约旦消元法和伴随矩阵求逆矩阵。

  1. 待定系数法:
    假设矩阵A:
    [ 1 2 3 4 5 6 7 8 9 ] \left[ \begin{matrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \end{matrix} \right] 147258369
    设其逆矩阵为 A − 1 A^{-1} A1
    [ a 11 a 12 a 13 a 21 a 22 a 23 a 31 a 32 a 33 ] \left[ \begin{matrix} a_{11} & a_{12} & a_{13} \\ a_{21} & a_{22} & a_{23} \\ a_{31} & a_{32} & a_{33} \end{matrix} \right] a11a21a31a12a22a32a13a23a33
    则有如下方程组:
    { 1 a 11 + 2 a 21 + 3 a 31 = 1 1 a 12 + 2 a 22 + 3 a 32 = 0 1 a 13 + 2 a 23 + 3 a 33 = 0 4 a 11 + 5 a 21 + 6 a 31 = 0 4 a 12 + 5 a 22 + 6 a 32 = 1 4 a 13 + 5 a 23 + 6 a 33 = 0 7 a 11 + 8 a 21 + 9 a 31 = 0 7 a 12 + 8 a 22 + 9 a 32 = 0 7 a 13 + 8 a 23 + 9 a 33 = 1 \begin{cases} 1a_{11} + 2a_{21} + 3a_{31} = 1 \\ 1a_{12} + 2a_{22} + 3a_{32} = 0 \\ 1a_{13} + 2a_{23} + 3a_{33} = 0 \\ 4a_{11} + 5a_{21} + 6a_{31} = 0 \\ 4a_{12} + 5a_{22} + 6a_{32} = 1 \\ 4a_{13} + 5a_{23} + 6a_{33} = 0 \\ 7a_{11} + 8a_{21} + 9a_{31} = 0 \\ 7a_{12} + 8a_{22} + 9a_{32} = 0 \\ 7a_{13} + 8a_{23} + 9a_{33} = 1 \\ \end{cases} 1a11+2a21+3a31=11a12+2a22+3a32=01a13+2a23+3a33=04a11+5a21+6a31=04a12+5a22+6a32=14a13+5a23+6a33=07a11+8a21+9a31=07a12+8a22+9a32=07a13+8a23+9a33=1
    解出该方程组即可得到逆矩阵 A − 1 A^{-1} A1

  2. 伴随矩阵求逆矩阵:
    设矩阵 A A A的伴随矩阵为 A ∗ A^* A,则有
    A − 1 = 1 ∣ A ∣ A ∗ A^{-1} = \frac{1}{|A|}A^* A1=A1A
    其中 ∣ A ∣ |A| A为矩阵 A A A的行列式。
    伴随矩阵的概念如下(注意里面元素的下标):
    A ∗ = [ A 11 A 21 ⋯ A n 1 A 12 A 22 ⋯ A n 2 ⋮ ⋮ ⋮ A 1 n A 2 n ⋯ A n n ] A^*=\left[\begin {array}{c} A_{11} &A_{21} &\cdots &A_{n1} \\ A_{12} &A_{22} &\cdots &A_{n2} \\ \vdots &\vdots & &\vdots\\ A_{1n} &A_{2n} &\cdots &A_{nn} \\ \end{array}\right] A= A11A12A1nA21A22A2nAn1An2Ann
    其中 A i j A_{ij} Aij为矩阵 A A A的第i,j行代数余子式。 M i j M_{ij} Mij余子式为矩阵 A A A去除第i行和j列元素后的矩阵, A i j = ( − 1 ) i + j M i j A_{ij}=(-1)^{i+j}M_{ij} Aij=(1)i+jMij
    因此如果需要使用这个方法求逆矩阵,则先要实现行列式求值,使用伴随矩阵求逆矩阵的代码如下:

    //使用伴随矩阵法求矩阵的逆
    #include 
    //打印矩阵
    void print_matrix(double **A,int m,int n)
    {
        for (int i = 0; i < m;i++)
        {
            for (int j = 0; j < n;j++)
            {
                std::cout<>n;//输入数组维度
        double **A=new double *[n];
        std::cout<<"Enter the coefficient matrix:"<>A[i][j];//每次输入一个数字都用空格隔开,输入样例
                //1 2 3\enter
                //4 5 6\enter
                //7 8 9\enter
            }
        }
        double **A_inverse=new double *[n];
        for(int i=0;i

    求逆矩阵(C++)_第1张图片

  3. 高斯消元法求逆矩阵
    这个方法用于手算比较多,但是代码实现也比较简单,其原理如下:
    设矩阵 A A A:
    A = [ a 11 a 12 a 13 a 21 a 22 a 23 a 31 a 32 a 33 ] A=\left[\begin {array}{c} a_{11} &a_{12} &a_{13} \\ a_{21} &a_{22} &a_{23} \\ a_{31} &a_{32} &a_{33} \\ \end{array}\right] A= a11a21a31a12a22a32a13a23a33
    在其右侧增加一个单位矩阵 E E E,其实成为增广矩阵 A ^ = [ A ∣ E ] \hat{A}=[A|E] A^=[AE]:
    A ^ = [ a 11 a 12 a 13 ∣ 1 0 0 a 21 a 22 a 23 ∣ 0 1 0 a 31 a 32 a 33 ∣ 0 0 1 ] \hat{A}=\left[\begin {array}{c} a_{11} &a_{12} &a_{13} &|&1&0&0\\ a_{21} &a_{22} &a_{23} &|&0&1&0\\ a_{31} &a_{32} &a_{33} &|&0&0&1\\ \end{array}\right] A^= a11a21a31a12a22a32a13a23a33100010001
    然后通过初等行变换使得增广矩阵左边变为单位矩阵,右侧就变为了 A A A的逆矩阵。
    对应的代码如下:

    //这里展示如何用C++求矩阵的逆矩阵
    #include 
    //矩阵交换某两行
    void matrix_swap_row(double **A,int i,int j,int n)
    {
        double temp;
        for(int k=0;k>n;//输入数组维度
        double **A=new double *[n];
        std::cout<<"Enter the coefficient matrix:"<>A[i][j];//每次输入一个数字都用空格隔开,输入样例
                //1 2 3\enter
                //4 5 6\enter
                //7 8 9\enter
            }
        }
        double **A_inverse=new double *[n];
        for(int i=0;i

    运行结果如下:
    求逆矩阵(C++)_第2张图片

    上面两个结果都与matlab的输出结果一致,说明程序正确。
    t<<“The inverse matrix of A is:”< for(int i=0;i {
    for(int j=0;j {
    std::cout< }
    std::cout< }
    return 0;
    }

    运行结果如下:
    [外链图片转存中...(img-n8ojYPoe-1707404823324)]
    上面两个结果都与matlab的输出结果一致,说明程序正确。
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/2974c6b677134dfdadf65f05468e3f18.png#pic_center)
    
    

你可能感兴趣的:(计算方法,矩阵,c++,线性代数)