Я хотел бы предвосхитить это, сказав, что я новичок в C ++, поэтому будьте многословны в своих комментариях и / или предложениях.
Я пытаюсь реорганизовать некоторый код. Одна из операций, которые я выполняю, состоит в том, чтобы взять (запомненный) объект типа Eigen::LLT<Eigen::MatrixXd>
из списка и выполнить с ним некоторые вычисления.
Я хотел бы преобразовать этот расчет в меньшую функцию, но у меня возникли проблемы Передав тип Eigen::LLT<Eigen::MatrixXd>
в качестве параметра, придерживаясь ( моего, по общему признанию, шаткого понимания ) совета в документации Eigen здесь .
Я попробовал следующее :
#define _USE_MATH_DEFINES
#include <Eigen/LU>
#include <Eigen/Dense>
#include <math.h>
#include <unsupported/Eigen/SpecialFunctions>
Eigen::MatrixXd conditionalCov(
Eigen::Ref<const Eigen::MatrixXd> kxstarxstar,
Eigen::Ref<const Eigen::LLT<Eigen::MatrixXd>> lxx,
Eigen::Ref<const Eigen::MatrixXd> kxxstar
)
{
return (
kxstarxstar.array() - (kxxstar.transpose() * lxx.solve(kxxstar)).array()
).matrix().selfadjointView<Eigen::Lower>();
}
Но это не компилируется из-за неправильного определения типа для lxx
, а именно Eigen::Ref<const Eigen::LLT<Eigen::MatrixXd>>
. G CC говорит:
[<path_to_file>] error: ‘IsVectorAtCompileTime’ is not a member of ‘const Eigen::LLT<Eigen::Matrix<double, -1, -1>, 1>’
5 | Eigen::Ref<const Eigen::LLT<Eigen::MatrixXd>> lxx,
Каким должен быть тип lxx
(нижний коэффициент Холецкого), чтобы избежать создания временных матриц при вызове функции?