c++ - 用 Eigen 求解小型齐次线性系统的最快方法

标签 c++ linear-algebra eigen

我需要求解许多 Ax=0 形式的小 (n=4) 齐次线性系统,其中 A 是奇异矩阵。我目前正在使用以下代码:

void solve(const matrix_t& A, vector_t& x){
    auto svd = A.jacobiSvd(Eigen::ComputeFullU | Eigen::ComputeFullV);
    auto V = svd.matrixV();
    x = V.col( A.rows() - 1 );
    x.normalize();
}

有没有更快的方法来做到这一点?

最佳答案

获得具有特征的一般矩阵的零空间的最快方法是使用其 LU 分解。在实践中,我使用 Householder QR 分解而不是 LU,因为当输入矩阵不是完全奇异时它似乎更稳定。 QR 仍然比问题中提出的 SVD 快很多,并且为我的问题提供了非常相似的结果。可以在此处找到不同特征分解的基准:https://eigen.tuxfamily.org/dox/group__DenseDecompositionBenchmark.html

用 LU、QR 和 SVD 计算零空间的代码(注意:x.normalize() 不是必需的,但有助于比较解决方案):

template<typename matrix_t, typename vector_t>
void solveNullspaceLU(const matrix_t& A, vector_t& x){
    x = A.fullPivLu().kernel();
    x.normalize();
}

template<typename matrix_t, typename vector_t>
void solveNullspaceQR(const matrix_t& A, vector_t& x){
    auto qr = A.transpose().colPivHouseholderQr();
    matrix_t Q = qr.householderQ();
    x = Q.col(A.rows() - 1);
    x.normalize();
}

template<typename matrix_t, typename vector_t>
void solveNullspaceSVD(const matrix_t& A, vector_t& x){
    x = A.jacobiSvd(Eigen::ComputeFullV).matrixV().col( A.rows() - 1 );
    x.normalize();
}

关于c++ - 用 Eigen 求解小型齐次线性系统的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45945481/

相关文章:

c++ - Linux 上 http_request::set_body 中的 cpprestsdk 段错误

c++ - 来自 cin 的未知行为

python - pickle scipy 的 SuperLU 类用于不完全 LU 分解

c++ - Eigen::aligned_allocator 因 std::unordered_multimap 而失败

c++ - 如何在可变大小的 vector 上使用叉积

c++ - 获取图像部分的平均值

c++ - 如何使用背包算法[而不仅仅是包的值(value)]找到包中的哪些元素?

python - 组合 Einsum 表达式

c++ - GeneralizedEigenSolver 不在特征库中给出特征向量

package - 将依赖于 RcppEigen 的 R 包与 Microsoft R Open 中的 MKL 链接