Почему Eigen не разрешает встроенные символы? (all, last, seq и т. д.) - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть этот фрагмент кода на сайте документации Eigen о нарезке и извлечении:

#include <iostream>
#include <Eigen/Dense>
#include <vector>
using namespace std;
using namespace Eigen;

int main() {
    std::vector<int> ind{4,2,5,5,3};
    MatrixXi A = MatrixXi::Random(4,6);
    cout << "Initial matrix A:\n" << A << "\n\n";
    cout << "A(all,ind):\n" << A(all,ind) << "\n\n";

    return 0;
}

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

  • all не является членом Eigen
  • all не было объявлено в этой области
  • last не было объявлено в этой области
  • seq не является членом Eigen
  • Функция seq не может быть разрешена
  • MatrixXi::Random неверные аргументы

Как я могу исправить эти ошибки?


Похоже, что у меня была неправильная версия Eigen (она работала здесь ), однако, согласно этот ответ у меня есть: EIGEN_WORLD_VERSION 3 EIGEN_MAJOR_VERSION 3 EIGEN_MINOR_VERSION 7, который, как я считаю, является самым последним.

Что касается установки, я скопировал папку Eigen в расположение проектаи предоставил путь (флаг -I) к на одну папку выше для компилятора g ++. Сама библиотека, кажется, работает хорошо;например, этот код (из предоставленных примеров) работает нормально:

#include <iostream>
#include <Eigen/Dense>

using namespace Eigen;
using namespace std;

int main()
{
  Matrix3d m = Matrix3d::Random();
  m = (m + Matrix3d::Constant(1.2)) * 50;
  cout << "m =" << endl << m << endl;
  Vector3d v(1,2,3);

  cout << "m * v =" << endl << m * v << endl;
}

1 Ответ

1 голос
/ 04 ноября 2019

Ваша проблема, вероятно, в опции -I для g ++

Я подозреваю, что у вас есть что-то вроде:

g++  ....  -I<path_to_project>/Eigen

... тогда как оно должно быть только

g++  ....  -I<path_to_project>

... т.е. конечный каталог Eigen не должен находиться в пути включения.

Внесите это изменение, а затем также измените исходный код, чтобы все включения были такими:1014 *

Кроме того, вы ссылаетесь на переменную all, но ваша программа не определила ее.

Также убедитесь, что вы включили опцию компилятора c ++ 11 как минимум.


РЕДАКТИРОВАНИЕ:

Для полноты картины я добавляю ответ, который появился в комментариях. Документация в вопросе OP относится к версии 3.3.9, которая не поддерживает символы all, last, seq. Для самой последней стабильной (3.3.7) версии должны использоваться операторы block или reshape.

Урок здесь: всегдапроверьте, соответствует ли версия документации версии используемой библиотеки .

...