在Eigen中求解一个稀疏的上三角系统?

时间:2014-06-27 01:56:48

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

对于密集矩阵,下面的代码解决了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]

我在文档中找不到答案,有人能弄明白怎么做吗?

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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