C ++:最も単純な行列への行列の基本行変換

最も単純なマトリックスは、次のステップに分けられます

行列の行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;
}

注:このコードでは、括弧に演算子のオーバーロードがあり、プログラミングのアイデアのみを提供します。コードの最適化に関する提案がある場合は、コメントできます。

おすすめ

転載: blog.csdn.net/superSmart_Dong/article/details/111026341