【问题标题】:Solving a sparse upper triangular system in Eigen?在 Eigen 中求解稀疏的上三角系统?
【发布时间】:2014-06-27 01:56:47
【问题描述】:

对于稠密矩阵,下面的代码解决 x^T A = b^T 就好了。

Matrix3d A;
RowVector3d bT, xT;

A << 1, 2, 3, 
     0, 5, 6, 
     0, 0, 9;

bT << 1, 2, 3;

xT = A.triangularView<Upper>().solve<OnTheRight>(bT);
printf("(%g, %g, %g)", xT(0), xT(1), xT(2));

但是,我无法将这种方法继续用于稀疏矩阵。

SparseMatrix<double> spA = A.sparseView();
spA.triangularView<Upper>().solve<OnTheRight>(bT);  // COMPILE ERR!
spA.triangularView<Upper>().solve<OnTheRight>(bT.sparseView());  // COMPILE ERR!

编译错误是

no matching function for call to ‘Eigen::SparseTriangularView<Eigen::SparseMatrix<double, 0>, 2>::solve(Eigen::RowVector3d&) const’
no matching function for call to ‘Eigen::SparseTriangularView<Eigen::SparseMatrix<double, 0>, 2>::solve(const Eigen::SparseView<Eigen::Matrix<double, 1, 3> >) const’

candidate is:

template<class OtherDerived> typename Eigen::internal::plain_matrix_type_column_major<OtherDerived>::type Eigen::SparseTriangularView::solve(const Eigen::MatrixBase<OtherDerived>&) const [with OtherDerived = OtherDerived, MatrixType = Eigen::SparseMatrix<double, 0>, int Mode = 2, typename Eigen::internal::plain_matrix_type_column_major<OtherDerived>::type = Eigen::internal::plain_matrix_type_column_major<T>::type]

我在文档中找不到答案,谁能弄清楚如何做到这一点?

EDIT SparseTriangularView::solve 既不接受 OnTheLeft 也不接受 OnTheRight 作为 模板参数,但我只是尝试忽略该参数,它似乎可以编译。我的猜测是它是一个缺失的功能,因此已将其报告给开发人员。如果他们确认,我会将他们的回复作为答案发布。

【问题讨论】:

    标签: c++ matrix eigen sparse-matrix triangular


    【解决方案1】:

    这确实是一个缺失的功能,但您可以通过转置所有内容轻松解决:

    xT.transpose() = spA.transpose().triangularView<Lower>().solve(bT.transpose());
    

    或者,如果你直接处理列向量:

    x = spA.transpose().triangularView<Lower>().solve(b);
    

    【讨论】:

    • 对于缺少 QR.solve(b) 是否有类似的技巧,其中 QR 是分解 A 的 SparseQR 对象? QR.matrixR().triangularView() 对于一般 A 来说不是正方形的,所以我想我必须在求解之前取它的 QR.rank() x QR.rank() 左上角?
    • 我不只是使用 QR.compute(A.transpose()) 的唯一原因是因为我已经将 QR.compute(A) 用于其他目的,而且数学看起来很简单:xT A = bT 用 AP = QR 分两步求解。在 yT R = bT P 中找到 yT。计算 xT = yT QT。
    猜你喜欢
    • 2013-09-07
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多