Передача нижнего фактора Холесского собственной матрицы в качестве параметра функции - PullRequest
0 голосов
/ 22 апреля 2020

Я хотел бы предвосхитить это, сказав, что я новичок в 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 (нижний коэффициент Холецкого), чтобы избежать создания временных матриц при вызове функции?

1 Ответ

0 голосов
/ 22 апреля 2020

Просто передайте объект LLT в качестве стандартной ссылки на константу C ++.

Передача kxstarxstar и kxxstar в Eigen::Ref также имеет смысл, только если вы намерены передать подблоки других матрицы. Если нет, просто передайте их как const Eigen::MatrixXd &. Если вы хотите передать их как Eigen::Ref, рекомендуется передать их как const &:

Eigen::MatrixXd conditionalCov(
    const Eigen::Ref<const Eigen::MatrixXd>& kxstarxstar,
    const Eigen::LLT<Eigen::MatrixXd> &lxx,
    const Eigen::Ref<const Eigen::MatrixXd>& kxxstar
    )

Примечание: внутри вашей функции нет необходимости выполнять преобразование между типами Matrix и Array, просто следующее должно дать тот же результат:

return (
    kxstarxstar - kxxstar.transpose() * lxx.solve(kxxstar)
    ).selfadjointView<Eigen::Lower>();
...