【问题标题】:Is there a way to find which direct solver is using solve()?有没有办法找到哪个直接求解器正在使用solve()?
【发布时间】:2021-06-07 23:43:41
【问题描述】:

正如标题所说,有没有办法找出哪个矩阵分解正在为 R 中的给定稀疏矩阵应用函数solve()? 例如,在 Matlab 中有 spparms('spumoni', 2); ,它返回有关用于解决稀疏矩阵分解的算法的一些信息。

【问题讨论】:

    标签: r math sparse-matrix algebra matrix-decomposition


    【解决方案1】:

    嗯,运行 R 就可以了

    > methods(solve)
    

    会产生

    [1] solve.default solve.qr
    

    如果你输入

    > solve.default
    

    你会回来的

    function (a, b, tol = .Machine$double.eps, LINPACK = FALSE, ...)
    {
        if (!missing(LINPACK))
            warning("the LINPACK argument has been defunct since R 3.1.0")
        if (is.complex(a) || (!missing(b) && is.complex(b))) {
            a <- as.matrix(a)
            if (missing(b)) {
                b <- diag(1 + (0+0i), nrow(a))
                colnames(b) <- rownames(a)
            }
            return(.Internal(La_solve_cmplx(a, b)))
        }
        if (inherits(a, "qr")) {
            warning("solve.default called with a \"qr\" object: use 'qr.solve'")
            return(solve.qr(a, b, tol))
        }
        a <- as.matrix(a)
        if (missing(b)) {
            b <- diag(1, nrow(a))
            colnames(b) <- rownames(a)
        }
        .Internal(La_solve(a, b, tol))
    }
    

    这意味着它是 La_solve 或 La_solve_cmplx。查看他们的实现,例如here 可以发现 La_solve 将调用 LAPACK 例程DGESV,而 La_solve_cmplx 将调用 LAPACK 例程 ZGESV。

    简单吧?

    【讨论】:

    • 感谢您的回答,但这不是我想要的。我正在寻找一种方法来找到求解器用于某个矩阵的方法。例如,通过将签名设置为signature(a = "dsCMatrix", b = "....") ,R会判断某个矩阵是否可以被Cholesky分解,然后应用Cholesky或PALU分解。我想知道 R 是否对给定矩阵使用其中一种方法。 methods(solve),您建议列出 solve 的所有可能求解器。
    • @JackFrost67 嗯,要么是solve.qr(QR分解)要么是DGESV,没有别的了。您可以避免调度并直接调用solve.default并检查结果是否相同,然后肯定是DGESV。如果你想要别的东西,你必须使用cran.r-project.org/web/packages/Matrix/index.html 或类似的东西
    • 忘了说,除了 LAPACK 之外,还有 R 包可以使用来自 R 的 Eigen C++,cran.r-project.org/web/packages/RcppEigen/index.html。我自己没用过
    猜你喜欢
    • 2021-08-08
    • 2015-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-10
    • 2019-12-02
    • 1970-01-01
    相关资源
    最近更新 更多