Simple 3x3 matrix inverse code (C++)

后端 未结 13 2079
花落未央
花落未央 2020-12-04 19:35

What\'s the easiest way to compute a 3x3 matrix inverse?

I\'m just looking for a short code snippet that\'ll do the trick for non-singular matrices, possibly using C

13条回答
  •  遥遥无期
    2020-12-04 19:58

    //Title: Matrix Header File
    //Writer: Say OL
    //This is a beginner code not an expert one
    //No responsibilty for any errors
    //Use for your own risk
    using namespace std;
    int row,col,Row,Col;
    double Coefficient;
    //Input Matrix
    void Input(double Matrix[9][9],int Row,int Col)
    {
        for(row=1;row<=Row;row++)
            for(col=1;col<=Col;col++)
            {
                cout<<"e["<>Matrix[row][col];
            }
    }
    //Output Matrix
    void Output(double Matrix[9][9],int Row,int Col)
    {
        for(row=1;row<=Row;row++)
        {
            for(col=1;col<=Col;col++)
                cout<1)
            for(row=tRow-1;row>=1;row--)
            {
                Coefficient=MatrixUp[row][tCol];
                for(col=1;col<=Col;col++)
                    MatrixUp[row][col]-=Coefficient*MatrixUp[tRow][col];
            }
        return MatrixUp;
    }
    //Pivote in Determinant
    double MatrixPiv[9][9];
    double (*(Pivote)(double MatrixInput[9][9],int Dim,int pTarget))[9]
    {
        CopyMatrix(MatrixInput,MatrixPiv,Dim,Dim);
        for(row=pTarget+1;row<=Dim;row++)
        {
            Coefficient=MatrixPiv[row][pTarget]/MatrixPiv[pTarget][pTarget];
            for(col=1;col<=Dim;col++)
            {
                MatrixPiv[row][col]-=Coefficient*MatrixPiv[pTarget][col];
            }
        }
        return MatrixPiv;
    }
    //Determinant of Square Matrix
    int dCounter,dRow;
    double Det;
    double MatrixDet[9][9];
    double Determinant(double MatrixInput[9][9],int Dim)
    {
        CopyMatrix(MatrixInput,MatrixDet,Dim,Dim);
        Det=1.0;
        if(Dim>1)
        {
            for(dRow=1;dRow1;Counter--)
        {
            Pointer=PivoteUp(MatrixAug,Row,Col,Counter,Counter);
            CopyPointer(Pointer,MatrixAug,Row,Col);
        }
        for(row=1;row<=Dim;row++)
            for(col=1;col<=Dim;col++)
                MatrixInv[row][col]=MatrixAug[row][col+Dim];
        return MatrixInv;
    }
    //Gauss-Jordan Elemination
    double MatrixGJ[9][9];
    double VectorGJ[9][9];
    double (*(GaussJordan)(double MatrixInput[9][9],double VectorInput[9][9],int Dim))[9]
    {
        Row=Dim;
        Col=Dim+1;
        Pointer=JoinMatrix(MatrixInput,VectorInput,Dim,Dim,1);
        CopyPointer(Pointer,MatrixGJ,Row,Col);
        for(Counter=1;Counter<=Dim;Counter++)   
        {
            Pointer=PivoteDown(MatrixGJ,Row,Col,Counter,Counter);
            CopyPointer(Pointer,MatrixGJ,Row,Col);
        }
        for(Counter=Dim;Counter>1;Counter--)
        {
            Pointer=PivoteUp(MatrixGJ,Row,Col,Counter,Counter);
            CopyPointer(Pointer,MatrixGJ,Row,Col);
        }
        for(row=1;row<=Dim;row++)
            for(col=1;col<=1;col++)
                VectorGJ[row][col]=MatrixGJ[row][col+Dim];
        return VectorGJ;
    }
    //Generalized Gauss-Jordan Elemination
    double MatrixGGJ[9][9];
    double VectorGGJ[9][9];
    double (*(GeneralizedGaussJordan)(double MatrixInput[9][9],double VectorInput[9][9],int Dim,int vCol))[9]
    {
        Row=Dim;
        Col=Dim+vCol;
        Pointer=JoinMatrix(MatrixInput,VectorInput,Dim,Dim,vCol);
        CopyPointer(Pointer,MatrixGGJ,Row,Col);
        for(Counter=1;Counter<=Dim;Counter++)   
        {
            Pointer=PivoteDown(MatrixGGJ,Row,Col,Counter,Counter);
            CopyPointer(Pointer,MatrixGGJ,Row,Col);
        }
        for(Counter=Dim;Counter>1;Counter--)
        {
            Pointer=PivoteUp(MatrixGGJ,Row,Col,Counter,Counter);
            CopyPointer(Pointer,MatrixGGJ,Row,Col);
        }
        for(row=1;row<=Row;row++)
            for(col=1;col<=vCol;col++)
                VectorGGJ[row][col]=MatrixGGJ[row][col+Dim];
        return VectorGGJ;
    }
    //Matrix Sparse, Three Diagonal Non-Zero Elements
    double MatrixSpa[9][9];
    double (*(Sparse)(int Dimension,double FirstElement,double SecondElement,double ThirdElement))[9]
    {
        MatrixSpa[1][1]=SecondElement;
        MatrixSpa[1][2]=ThirdElement;
        MatrixSpa[Dimension][Dimension-1]=FirstElement;
        MatrixSpa[Dimension][Dimension]=SecondElement;
        for(int Counter=2;Counter

    Copy and save the above code as Matrix.h then try the following code:

    #include
    #include
    #include"Matrix.h"
    int Dim;
    double Matrix[9][9];
    int main()
    {
        cout<<"Enter your matrix dimension: ";
        cin>>Dim;
        Input(Matrix,Dim,Dim);
        cout<<"Your matrix:"<

提交回复
热议问题