您的位置:首页 > 编程语言 > C语言/C++

C++矩阵运算实现

2017-01-07 13:28 363 查看

C++矩阵运算实现

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

目录

[TOC]
来生成目录:

C矩阵运算实现

目录

矩阵求行列式
矩阵行列式代码块

求矩阵的逆
矩阵求逆代码块

矩阵求行列式

矩阵求行列式在线性代数有代数子式计算,还有化成上三角或者下三角的方法,其他的可以参考线性代数再细看,给的链接只能计算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的逆矩阵,这也是我们在学线性代数时求矩阵逆时所采用的方法,根据这个思路编写代码,
bdf3
其实就是求行列式思路一样,下面给出代码。再次强调,不要瞎贴代码,自己可以参考我的再进行改进,编写属于自己风格的代码:

矩阵求逆代码块

//求逆矩阵,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;
}


代码运行结果:

三阶矩阵:



四阶矩阵:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: