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; }
代码运行结果:
三阶矩阵:
四阶矩阵:
相关文章推荐
- C/C++语言实现矩阵求逆运算—高斯约化/消元法
- 问题五十二:怎么用C++实现矩阵运算
- 在C++中实现矩阵运算
- C++实现矩阵运算
- C++实现矩阵类,实现了大部分矩阵运算功能,大家可以类比matlab
- 矩阵基本运算的实现(standard C++Version)
- DCT变换及量化的c++实现(基于opencv矩阵运算)
- 矩阵相乘求最少相乘次数的C++实现代码
- 矩阵论基础 2.5 用Matlab实现矩阵的基本运算
- 转贴C/C++用移位实现乘除法运算,提高运行效率
- C++实现的线性代数矩阵计算
- 实数四则运算表达式的计算,C++ 实现
- c++实现任意矩阵求逆
- 从易到难编写C++程序,(8)问题:实现一个矩阵类
- CUDA/GPU下矩阵乘法的几种实现的C++源码
- 大数四则运算的C++实现(转)
- 矩阵运算的C#代码实现
- 回型矩阵的C++实现
- 大数四则运算的C++实现
- 用C++实现打印蛇形矩阵