C++ : 矩阵初等行变换,化成最简矩阵
生活随笔
收集整理的這篇文章主要介紹了
C++ : 矩阵初等行变换,化成最简矩阵
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
化成最簡矩陣分成如下步驟
從矩陣的第 i=0 行開始化簡
1.尋找最長元素行:從第i行開始,尋找第一個開頭行元素非0的行,利用行交換把該行換到矩陣的第i行。
2.對第i行進(jìn)行化簡:對第i行的所有元素同除該行的首個非0元素。
3.矩陣行化簡: 從矩陣的第 j=0 行開始。與第i行首個非0元素同列的元素,即為行化簡的倍數(shù),每行減去該 倍數(shù)*第i行的值就得到了一次行化簡的結(jié)果 ,回第1步,i++。
?
/*** 矩陣行變換成最簡矩陣* @tparam ElemType* @return*/ template<typename ElemType> SmartDongLib::Matrix<ElemType> SmartDongLib::Matrix<ElemType>::simplyTransform() {Matrix<ElemType> ret(*this);//表示將要化1的矩陣行for (int transferRow = 0; transferRow < theRows_; ++transferRow) {//按列循環(huán)每行找首個非0元素,從transferRow行開始尋找最長元素行int firstNotNullCol = 0;for (; firstNotNullCol < ret.theCols_; ++firstNotNullCol) {int row = transferRow;bool isfind= false;for (; row < ret.theRows_; ++row) {ElemType firstelem=ret(row, firstNotNullCol);if (!close(firstelem, (ElemType)0 )) {isfind = true;break;}}if (isfind){//如果找到最長元素行,則和transferRow行進(jìn)行行交換ret.rowSwap(transferRow,row);break;}}if (firstNotNullCol >= ret.theCols_){//零矩陣或者后繼行都是0return ret;}//當(dāng)前行首元素化1Real factor = ret(transferRow,firstNotNullCol);for (int col = firstNotNullCol; col < ret.theCols_; ++col) {ret(transferRow,col) = ret(transferRow,col) / factor;}//同列元素行化0for (int i = 0 ; i < ret.theRows_; ++i) {if ( i ==transferRow )continue;Real factor2 = ret(i,firstNotNullCol);for (int j = firstNotNullCol; j < ret.theCols_; ++j) {ret(i,j) = ret(i,j) - ret(transferRow,j) * factor2;}}}return ret; }注:此代碼對括號作了運算符重載,僅提供編程思路。如有代碼優(yōu)化的建議可以評論。
總結(jié)
以上是生活随笔為你收集整理的C++ : 矩阵初等行变换,化成最简矩阵的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 时间复杂度、渐进记法、主定理
- 下一篇: s3c2440移植MQTT