Сбой вывода / замены аргумента шаблона при использовании linearRegression в библиотеке Eigen 2 - PullRequest
1 голос
/ 30 марта 2020

Я работаю в существующей кодовой базе C ++ и у меня возникают проблемы с вызовом функции.

Я пытаюсь использовать функцию линейной регрессии из более старой библиотеки Eigen, уже находящейся в кодовой базе, вы можете увидеть этот исходный код здесь , но ниже - соответствующее объявление.

template<typename VectorType>
void linearRegression(int numPoints,
                      VectorType **points,
                      VectorType *result,
                      int funcOfOthers )
{ ... }

Ниже приведена анонимная копия моего кода:

// MyClass has member variable int maxIdx = 5
void MyClass::myFunction()
{
    Eigen::Vector2d points[maxIdx];
    Eigen::Vector2d coeffs;
    for(int i = 0; i < maxIdx; i++)
    {
        points[i] = Eigen::Vector2d(data->mydata[i].x, data->mydata[i].y);
    }
    Eigen::linearRegression( maxIdx, &points, &coeffs, 1 );

    // do more stuff with coeffs
}

И это сообщение об ошибке, которое я получаю, когда Я пытаюсь скомпилировать:

myfile.cpp:803:67: error: no matching function for call to 'linearRegression(int, Eigen::Vector2d (*)[((MyClass*)this)->MyClass::maxIdx], Eigen::Vector2d*, int)'
         Eigen::linearRegression( maxIdx, &points, &coeffs, 1 );
                                                                   ^
myfile.cpp:803:67: note: candidate is:
In file included from [redacted]:
lib/Eigen/src/Eigen2Support/LeastSquares.h:85:6: note: template<class VectorType> void Eigen::linearRegression(int, VectorType**, VectorType*, int)
 void linearRegression(int numPoints,
      ^
lib/Eigen/src/Eigen2Support/LeastSquares.h:85:6: note:   template argument deduction/substitution failed:
myfile.cpp:803:67: note:   mismatched types 'VectorType*' and 'Eigen::Vector2d [((MyClass*)this)->MyClass::maxIdx] {aka Eigen::Matrix<double, 2, 1> [((MyClass*)this)->MyClass::maxIdx]}'

Это довольно точная копия примера кода в исходном коде библиотеки, поэтому я немного растерялся, как это исправить. Я не очень знаком с шаблонами, поэтому ошибка типа может быть связана с этим?

Ответы [ 2 ]

3 голосов
/ 30 марта 2020

Согласно этому источнику (и в отличие от того, что написано в их примере), points, как ожидается, будет массивом указателей на точки. То есть

Eigen::Vector2d *points[maxIdx];

Итак,

Eigen::Vector2d points[maxIdx];
Eigen::Vector2d *point_ptrs[maxIdx];
for(int i = 0; i < maxIdx; i++)
    point_ptrs[i] = &points[i];
...
Eigen::linearRegression(maxIdx, point_ptrs, &coeffs, 1);

Это выглядит глупо для Vector2d, но, вероятно, предназначено для больших векторов, которые не очень приятно копировать .

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

Чтобы ответить на вопрос @ numzero, этот код скомпилирован, но я получил время выполнения cra sh, когда пытался его выполнить. Похоже, что второй аргумент должен быть первый индекс в этом массиве указателей. Этот ответ объясняет, что происходило и во время выполнения не получалось, хотя и компилировалось.

Вот что в итоге мне помогло:

Eigen::Vector2d points[maxIdx];
std::vector<Eigen::Vector2d*> point_ptrs(maxIdx);
Eigen::Vector2d coeffs;
for(int i = 0; i < maxIdx; i++)
{
    points[i] = Eigen::Vector2d(data->mydata[i].x, data->mydata[i].y);
    point_ptrs[i] = &points[i];
}
Eigen::linearRegression( maxIdx, &(point_ptrs[0]), &coeffs, 1 );

...