簡體   English   中英

PLU 分解的逆矩陣

[英]Matrix inverse from PLU decomposition

我試圖從 plu 分解計算逆矩陣,但我得到的結果是錯誤的。 使用調試器,我找不到可以責備的單個步驟,所以這里是反轉函數的代碼:

template<class T>
Matrix<T> Matrix<T>::inv() const {
    std::tuple<Matrix<T>, Matrix<T>, Matrix<T>> PLU(this->decomp_PLU());
    Matrix<T> P(std::get<0>(PLU));
    Matrix<T> L(std::get<1>(PLU));
    Matrix<T> U(std::get<2>(PLU));

    if (!this->lines() == this->cols()) { throw std::logic_error("Matrix must be square"); }
    unsigned N = this->lines();

    Matrix<T> Y(N, N);
    for (unsigned i = 0; i < N; i++) {
        Matrix<T> B(Matrix<T>::gen_col(P.transp().data[i])); // B is the ith column vector of P
        Y[i] = Matrix<T>::solve_climb(L, B).transp().data[0]; // Compute LY=P for each column vector

        Matrix<T> conf(L.dot(Matrix<T>::gen_col(Y[i])));
        if (!conf.allclose(B, 1e-9, 1e-9)) {
            throw std::logic_error("WHYY");
        }
    }
    Y = Y.transp();

    Matrix<T> X(N, N);
    for (unsigned i = 0; i < N; i++) {
        Matrix<T> B(Matrix<T>::gen_col(Y.transp().data[i])); // B is the ith column vector of Y
        X[i] = Matrix<T>::solve_descent(U, B).transp().data[0]; // Compute UX=Y for each column vector

        Matrix<T> conf(U.dot(Matrix<T>::gen_col(X[i])));
        if (!conf.allclose(B, 1e-9, 1e-9)) {
            throw std::logic_error("WHYY");
        }
    }
    X = X.transp();

    return X;
}

函數Matrix<T>::gen_col從其輸入生成一個列向量, solve_climb / solve_descent分別計算求解 AX=B 的列向量,其中 A 是三角矩陣(根據情況不同或優於)

僅供參考,當嘗試檢查每個向量的計算是否正確時,代碼會拋出邏輯錯誤“WHYY”。

代碼可能出錯的任何線索?

謝謝

編輯:完整代碼在這里 (matrix_def.h)這里 (matrix.h)

由於 L 是三角形劣勢,您應該使用solve_descent ,而不是solve_climb U(三角上級)也是如此,您需要使用solve_climb

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM