最も単純なマトリックスは、次のステップに分けられます
行列の行i = 0から単純化します
1.最長の要素行を見つけます。i番目の行から始めて、要素が最初に0でない最初の行を探し、行スワップを使用して行を行列のi番目の行に変更します。
2. i番目の行を単純化します。i番目の行のすべての要素は、行の最初のゼロ以外の要素を除いて同じです。
3.行列行の簡略化:行列のj = 0行目から開始します。i番目の行の最初の非ゼロ要素と同じ列の要素は、行の簡略化の倍数です。各行は、この倍数* 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;
}
注:このコードでは、括弧に演算子のオーバーロードがあり、プログラミングのアイデアのみを提供します。コードの最適化に関する提案がある場合は、コメントできます。