Решение разреженной верхней треугольной системы в Eigen?

Для плотных матриц следующий код решает 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 :: решить не принимает ни Налево ни Справа как
аргумент шаблона, но я просто попытался пренебречь аргументом, и он, кажется, компилируется. Я предполагаю, что это отсутствующая функция, и они сообщили об этом разработчикам. Если они подтвердят, я опубликую их ответ как ответ.

3

Решение

Это действительно недостающая особенность, но вы можете легко обойти, перенеся все:

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

или, если вы имеете дело непосредственно с векторами столбцов:

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

Другие решения


По вопросам рекламы [email protected]