我需要求解许多 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/