线性代数-矩阵-【5】矩阵化简 C和C++实现
2017-09-01 19:52
381 查看
点击这里可以跳转至
【1】矩阵汇总:http://www.cnblogs.com/HongYi-Liang/p/7287369.html
【2】矩阵生成:http://www.cnblogs.com/HongYi-Liang/p/7275278.html
【3】矩阵加减:http://www.cnblogs.com/HongYi-Liang/p/7287403.html
【4】矩阵点乘:http://www.cnblogs.com/HongYi-Liang/p/7287324.html
【5】矩阵化简:现在的位置
(待续)
...
View Code
使用我们开始的矩阵测试:
结果:
【1】矩阵汇总:http://www.cnblogs.com/HongYi-Liang/p/7287369.html
【2】矩阵生成:http://www.cnblogs.com/HongYi-Liang/p/7275278.html
【3】矩阵加减:http://www.cnblogs.com/HongYi-Liang/p/7287403.html
【4】矩阵点乘:http://www.cnblogs.com/HongYi-Liang/p/7287324.html
【5】矩阵化简:现在的位置
(待续)
...
C++语言:
高斯消元法:
继续使用这个矩阵template <typename T> bool Matrix<T>::rrefmovie() { Matrix<T> outputMatrix = *this; int rank=0;//the rank of the matrix, how many columns's pivot will it has(-1) /*Gauss elmiation*/ cout<<"Gauss elimination:"<<endl; outputMatrix.printfAll(); for(int k=0;k<outputMatrix.m_iRows;k++) { /*If all the pivot elem have been found*/ if(k>=m_iColumns) { break; } /*Exchange rows downward to find the pivot row*/ for(int i=k+1;i<outputMatrix.m_iRows;i++) { /*Pivot is non-zero*/ if(outputMatrix.m_vecMatrix[k][k] != 0) { rank++; break; } else { if(i < outputMatrix.m_iRows) { outputMatrix.exchangeRows(k,i); } } if(k!=i) { cout<<"row"<<k+1<<" exchange row"<<i+1<<endl;//Debug outputMatrix.printfAll(); } } /*If there is no pivot in this row*/ if(outputMatrix.m_vecMatrix[k][k] == 0) { break; } /*Elimination:The rows below pivot row subtract times of pivot row*/ for(int i=k+1;i<outputMatrix.m_iRows;i++) { double RowsfirstData = outputMatrix.m_vecMatrix[i][k]/outputMatrix.m_vecMatrix[k][k];//Save the first data of next(k+1) rows if(RowsfirstData != 0) { outputMatrix.m_vecMatrix[i][k]=0; for(int j=k+1;j<outputMatrix.m_iColumns;j++) { outputMatrix.m_vecMatrix[i][j] -= RowsfirstData*outputMatrix.m_vecMatrix[k][j] ; } } cout<<"row"<<i+1<<" - "<<RowsfirstData<<"*"<<"row"<<k+1<<endl;//Debug outputMatrix.printfAll(); } } /*Normalizing:set all rows pivot to 1*/ for(int i=0;i<outputMatrix.m_iRows;i++) { for(int j=0;j<outputMatrix.m_iColumns;j++) { if(outputMatrix.m_vecMatrix[i][j] !=0 )//pivot has been foound { double pivot = outputMatrix.m_vecMatrix[i][j];//get pivot for(int k=i;k<outputMatrix.m_iColumns;k++) { outputMatrix.m_vecMatrix[i][k] /=pivot; } cout<<"row"<<i+1<<" / "<<pivot<<endl;//Debug outputMatrix.printfAll();//Debug break; } } } /*Back substitution*/ cout<<"Back substitution:"<<endl; for(int i = rank;i>=1;i--) { /*find a first non-zero elem (It is pivot)*/ for(int j=0;j<outputMatrix.m_iColumns;j++) { double times=0; if(outputMatrix.m_vecMatrix[i][j] !=0)//pivot found { for(int l=i-1;l>=0;l--) { times = outputMatrix.m_vecMatrix[l][j]/outputMatrix.m_vecMatrix[i][j]; for(int k=j;k<outputMatrix.m_iColumns;k++)//tims of this row subtract by each columns in upon row { outputMatrix.m_vecMatrix[l][k] -= times*outputMatrix.m_vecMatrix[i][k]; } cout<<"row"<<l+1<<" - "<<times<<"*"<<"row"<<i+1<<endl; outputMatrix.printfAll(); } break; } } } *this = outputMatrix; return true; }
View Code
使用我们开始的矩阵测试:
Matrix<double> matrix(3,3); matrix.setSpecifiedElem(0,0,1); matrix.setSpecifiedElem(0,1,2); matrix.setSpecifiedElem(0,2,3); matrix.setSpecifiedElem(1,0,2); matrix.setSpecifiedElem(1,1,2); matrix.setSpecifiedElem(1,2,2); matrix.setSpecifiedElem(2,0,4); matrix.setSpecifiedElem(2,1,5); matrix.setSpecifiedElem(2,2,6); matrix.printfAll(); matrix.rrefmovie(); matrix.printfAll(); system("pause");
结果:
相关文章推荐
- 线性代数-矩阵-【3】矩阵加减 C和C++实现
- 线性代数-矩阵-转置 C和C++的实现
- 线性代数教程之一——矩阵乘法计算、理解及代码实现
- 线性代数标准型矩阵化简技巧
- C++ 实现求一串数字的逆序数{线性代数里的逆序数}
- hlg1600线性代数中的矩阵问题【区间dp】
- C++ 矩阵加法与乘法的实现
- Fibonacci数的矩阵实现和线性递增实现
- Andrew Ng 机器学习笔记 03 :线性代数之矩阵
- 线性代数 02.01 矩阵
- 线性代数之一:方程组与矩阵
- 线性代数笔记:行列式和矩阵;以及具体实战
- MIT18.06线性代数课程笔记5:矩阵转置,vector space以及subspace
- C++实现稀疏矩阵的压缩存储、转置、快速转置
- 线性代数——矩阵基本概念与随机矩阵 Stochastic Matrices
- 矩阵相乘-c++代码实现及运行实例结果
- 矩阵相乘strassen-c++代码实现及运行实例结果
- C++实现矩阵压缩存储与(快速)转置
- 数据结构(12)线性表之C++实现一元多项式相加
- C++实现矩阵链乘法利用动态规划及运行实例结果