📜  使用高斯–乔丹方法求矩阵的逆套装2

📅  最后修改于: 2021-05-30 13:43:04             🧑  作者: Mango

给定一个矩阵,任务是使用高斯-乔丹方法找到该矩阵的逆。
什么是矩阵?

矩阵是数字的有序矩形数组。

可以在矩阵上执行的运算是矩阵的加法,减法,乘法或转置等。

矩阵的逆:

给定一个非奇异的方阵A(意味着A的行列式不为零);然后存在一个矩阵

A^-^1

这称为矩阵A的逆。
矩阵的逆仅在以下属性成立时才可能:

  1. 矩阵必须是正方形矩阵。
  2. 矩阵必须是非奇异矩阵,并且
  3. 存在一个恒等式I

A A^-^1 = A^-^1 A = I.

通常,可以使用以下简单公式找到n X n矩阵A的逆:

其中,Adj(A)表示矩阵的伴随,而Det(A)是矩阵A的行列式。

查找矩阵逆的方法:

找到2×2矩阵的逆是一项简单的任务,但是要找到较大矩阵(例如3×3、4×4等)的逆是一项艰巨的任务,因此可以使用以下方法:

  1. 基本行运算(Gauss-Jordan方法) (有效)
  2. 未成年人,辅因子和陪审法(效率低下)

基本行运算(高斯–乔丹方法):

Gauss-Jordan方法是高斯消除的一种变体,其中执行行约简运算以查找矩阵的逆。
使用高斯-乔丹方法找到矩阵逆的步骤:
为了找到矩阵的逆,需要遵循以下步骤:

  1. 由单位矩阵形成扩充矩阵。
  2. 在此扩展矩阵上执行行缩减操作,以生成矩阵的行缩减梯形形式。
  3. 需要时,对增强矩阵执行以下行操作:
    • 互换任意两行。
    • 将行的每个元素乘以非零整数。
    • 用自身和矩阵另一行的常数倍之和替换一行。

例子:

  • 增强矩阵的形式为A:B

  • 应用高斯-乔丹消除法后:

下面是使用Gauss-Jordan方法查找矩阵逆的C++程序:

CPP
// C++ program to find the inverse of Matrix.
 
#include 
#include 
using namespace std;
 
// Function to Print matrix.
void PrintMatrix(float** ar, int n, int m)
{
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cout << ar[i][j] << "  ";
        }
        printf("\n");
    }
    return;
}
 
// Function to Print inverse matrix
void PrintInverse(float** ar, int n, int m)
{
    for (int i = 0; i < n; i++) {
        for (int j = n; j < m; j++) {
            printf("%.3f  ", ar[i][j]);
        }
        printf("\n");
    }
    return;
}
 
// Function to perform the inverse operation on the matrix.
void InverseOfMatrix(float** matrix, int order)
{
    // Matrix Declaration.
 
    float temp;
 
    // PrintMatrix function to print the element
    // of the matrix.
    printf("=== Matrix ===\n");
    PrintMatrix(matrix, order, order);
 
    // Create the augmented matrix
    // Add the identity matrix
    // of order at the end of original matrix.
    for (int i = 0; i < order; i++) {
 
        for (int j = 0; j < 2 * order; j++) {
 
            // Add '1' at the diagonal places of
            // the matrix to create a identity matirx
            if (j == (i + order))
                matrix[i][j] = 1;
        }
    }
 
    // Interchange the row of matrix,
    // interchanging of row will start from the last row
    for (int i = order - 1; i > 0; i--) {
 
        // Swapping each and every element of the two rows
        // if (matrix[i - 1][0] < matrix[i][0])
        // for (int j = 0; j < 2 * order; j++) {
        //
        //        // Swapping of the row, if above
        //        // condition satisfied.
        // temp = matrix[i][j];
        // matrix[i][j] = matrix[i - 1][j];
        // matrix[i - 1][j] = temp;
        //    }
 
        // Directly swapping the rows using pointers saves
        // time
 
        if (matrix[i - 1][0] < matrix[i][0]) {
            float* temp = matrix[i];
            matrix[i] = matrix[i - 1];
            matrix[i - 1] = temp;
        }
    }
 
    // Print matrix after interchange operations.
    printf("\n=== Augmented Matrix ===\n");
    PrintMatrix(matrix, order, order * 2);
 
    // Replace a row by sum of itself and a
    // constant multiple of another row of the matrix
    for (int i = 0; i < order; i++) {
 
        for (int j = 0; j < order; j++) {
 
            if (j != i) {
 
                temp = matrix[j][i] / matrix[i][i];
                for (int k = 0; k < 2 * order; k++) {
 
                    matrix[j][k] -= matrix[i][k] * temp;
                }
            }
        }
    }
 
    // Multiply each row by a nonzero integer.
    // Divide row element by the diagonal element
    for (int i = 0; i < order; i++) {
 
        temp = matrix[i][i];
        for (int j = 0; j < 2 * order; j++) {
 
            matrix[i][j] = matrix[i][j] / temp;
        }
    }
 
    // print the resultant Inverse matrix.
    printf("\n=== Inverse Matrix ===\n");
    PrintInverse(matrix, order, 2 * order);
 
    return;
}
 
// Driver code
int main()
{
    int order;
 
    // Order of the matrix
    // The matrix must be a square a matrix
    order = 3;
    /*
float matrix[20][20] = { { 5, 7, 9 },
                         { 4, 3, 8 },
                         { 7, 5, 6 },
                         { 0 } };
*/
    float** matrix = new float*[20];
    for (int i = 0; i < 20; i++)
        matrix[i] = new float[20];
 
    matrix[0][0] = 5;
    matrix[0][1] = 7;
    matrix[0][2] = 9;
    matrix[1][0] = 4;
    matrix[1][1] = 3;
    matrix[1][2] = 8;
    matrix[2][0] = 7;
    matrix[2][1] = 5;
    matrix[2][2] = 6;
 
    // Get the inverse of matrix
    InverseOfMatrix(matrix, order);
 
    return 0;
}


输出:
=== Matrix ===
5  7  9  
4  3  8  
7  5  6  

=== Augmented Matrix ===
7  5  6  0  0  1  
5  7  9  1  0  0  
4  3  8  0  1  0  

=== Inverse Matrix ===
-0.210  0.029  0.276  
0.305  -0.314  -0.038  
-0.010  0.229  -0.124





要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”