C++矩阵运算实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liumangmao1314/article/details/54173013

C++矩阵运算实现

C++库没有矩阵运算库,对于一些矩阵运算的话还是不方便。本文给了一些矩阵运算代码,加减乘的基本运算详见我给的链接,这里给出的是求行列式和求矩阵逆的代码。

目录

[TOC]来生成目录:


矩阵求行列式

矩阵求行列式在线性代数有代数子式计算,还有化成上三角或者下三角的方法,其他的可以参考线性代数再细看,给的链接只能计算2阶或者3阶,算不了高阶,而且用的是代数子式去计算,很费时间,不建议,所以自己摸索编写了化上三角求矩阵的行列式的代码,下面给出代码(大家不要瞎贴代码,有很多自定义函数和变量,请参照注释自行领悟代码的思路):

矩阵行列式代码块

//求矩阵的行列式,利用三角化的方法求行列式,失败返回-31415,成功返回值
float Matrix_Calc::Matrix_det(Matrix *A)
{
    if(A->cols!=A->rows)
    {
        cout<<"矩阵非方阵!"<<endl;
        return -31415;
    }
    Matrix C=Matrix_copy(A);
    for(int j=0;j<C.cols-1;j++)//先行后列,参照化上三角的方法
        for(int i=C.rows-1;i>j;i--)
        {
            if(C.read(j,j)==0)
            {
                change(&C,j,j+1,0);
            }
            if(C.read(i,j)==0)
                continue;
            double value=C.read(i,j)/C.read(j,j);
            for(int k=0;k<C.cols;k++)
            {
                double value1=C.read(i,k)-C.read(j,k)*value;
                C.write(i,k,value1);
            }
        }
    float det=1; //行列式
    for(int i=0;i<C.rows;i++)
    {
        det=det*C.read(i,i);
    }
    C.free_Matrix();
    return det;

}

代码运行结果:
这里写图片描述

求矩阵的逆

矩阵的逆也有很多种求法,比如比较笨的办法就是伴随矩阵除以行列式,这种方法很费时间,对于高阶矩阵运算量很大,编写起来也很麻烦(当然行列式不能为0)。还有一种就是初等行变换的办法,在矩阵后面贴n阶单位矩阵,将矩阵A化成单位矩阵时,后半就是矩阵A的逆矩阵,这也是我们在学线性代数时求矩阵逆时所采用的方法,根据这个思路编写代码,其实就是求行列式思路一样,下面给出代码。再次强调,不要瞎贴代码,自己可以参考我的再进行改进,编写属于自己风格的代码:

矩阵求逆代码块

//求逆矩阵,B=A^-1,利用初等行变换思路计算A的逆矩阵
int Matrix_Calc::Matrix_inv(Matrix *A)
{
    int A_cols=A->cols;
    Matrix_Calc m_c;
    if(!m_c.Matrix_det(A))//求行列式
    {
        cout<<"矩阵不可逆,已退出!"<<endl;
        return -1;
    }
    Matrix C=m_c.Matrix_identity(A->rows);//得到n阶单位矩阵
    m_c.Matrix_addCols(A,&C);//贴到后面
    C.free_Matrix();
    for(int j=0;j<A_cols-1;j++)//跟求行列式思路一样
        for(int i=A->rows-1;i>j;i--)
        {
            double value=A->read(i,j)/A->read(j,j);
            for(int k=0;k<A->cols;k++)
            {
                double value1=A->read(i,k)-A->read(j,k)*value;
                A->write(i,k,value1);
            }
        }
    for(int j=A_cols-1;j>0;j--)//将对角线上半部化成0
        for(int i=0;i<j;i++)
        {
            double value=A->read(i,j)/A->read(j,j);
            for(int k=0;k<A->cols;k++)
            {
                double value1=A->read(i,k)-A->read(j,k)*value;
                A->write(i,k,value1);
            }
        }
    for(int i=0;i<A->rows;i++)
    {
        float value=A->read(i,i);
        if(value!=1)
        {
            for(int j=0;j<A->cols;j++)
            {
                A->write(i,j,A->read(i,j)/value);
            }
        }
    }
    C=Matrix_copy(A);
    A->cols=C.cols/2;
    A->rows=C.rows;
    A->init_Matrix();
    for(int i=0;i<A->rows;i++)
        for(int j=0;j<A->cols;j++)
        {
            A->write(i,j,C.read(i,j+A->cols));
        }
    C.free_Matrix();
    return 1;
}

代码运行结果:
三阶矩阵:
这里写图片描述

四阶矩阵:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/liumangmao1314/article/details/54173013
今日推荐