c++ - PLU 分解的矩阵逆

标签 c++ algorithm math matrix matrix-inverse

我正在尝试计算 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从其输入生成一个列 vector ,并且 solve_climb/solve_descent每个计算求解 AX=B 的列 vector ,其中 A 是三角矩阵(下或上取决于情况)

仅供引用,当尝试检查每个 vector 的计算是否正确时,代码会抛出逻辑错误“WHYY”。

有任何关于代码可能出错的地方的线索吗?

谢谢

编辑:完整代码是 here (matrix_def.h)here (matrix.h)

最佳答案

由于 L 是下三角形,因此您应该使用 solve_descent,而不是 solve_climb。 U(上三角)也是如此,您需要使用 solve_climb

关于c++ - PLU 分解的矩阵逆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55626666/

相关文章:

c++ - 从 QT 中的主窗口发出信号

c++ - 将迭代器返回到多映射中最接近指定时间的时间

c++ - 精确的大有限域线性代数库(例如 GF(2^128)/GF(2^256) )

c++ - 我的程序不断四舍五入到最接近的整数

c++ - 智能指针/编码模式的名称

c++ - 在 C++ 中,函数的调用者能否确保其参数不会被修改?

java - 找到满足某些约束的矩阵

algorithm - 恒定时间内推送、弹出和出队操作的自定义数据结构

使用分页遍历列表的算法?

algorithm - 关于最短路径的非常困难和优雅的问题