化成最简矩阵分成如下步骤
从矩阵的第 i=0 行开始化简
1.寻找最长元素行:从第i行开始,寻找第一个开头行元素非0的行,利用行交换把该行换到矩阵的第i行。
2.对第i行进行化简:对第i行的所有元素同除该行的首个非0元素。
3.矩阵行化简: 从矩阵的第 j=0 行开始。与第i行首个非0元素同列的元素,即为行化简的倍数,每行减去该 倍数*第i行的值就得到了一次行化简的结果 ,回第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) {
//按列循环每行找首个非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行进行行交换
ret.rowSwap(transferRow,row);
break;
}
}
if (firstNotNullCol >= ret.theCols_){
//零矩阵或者后继行都是0
return ret;
}
//当前行首元素化1
Real factor = ret(transferRow,firstNotNullCol);
for (int col = firstNotNullCol; col < ret.theCols_; ++col) {
ret(transferRow,col) = ret(transferRow,col) / factor;
}
//同列元素行化0
for (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;
}
注:此代码对括号作了运算符重载,仅提供编程思路。如有代码优化的建议可以评论。