密行列の場合、次のコードは x^TA = 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もテンプレート引数として受け入れませんが、引数を無視しようとしただけでコンパイルされたようです。私の推測では、これは欠落している機能であり、そのように開発者に報告しています。彼らが確認したら、回答として回答を投稿します。