2015-11-06 2 views
0

Я пытаюсь зачитать элементы из 3D-матрицы, созданной с использованием динамического контейнера std C++ для векторов. Ниже, как я инициализировать свою матрицу:Матрица из вектора std в вектор от Eigen/Dense

typedef vector<vector<vector<ClassA> > > matrix3D;

В моем классе под названием "ClassA", у меня есть следующие открытые члены:

double a, b, c;

Затем в моем основном файле я заполняю матрицу:

double varA=M_PI; double varB=varA; double varC=varA;

matrix3D[i][j][k].a = varA;

matrix3D[i][j][k].b = varB;

matrix3D[i][j][k].c = varC;

Теперь, когда я прочитал двойник в вектор, созданных с помощью Эйгена/Густой библиотеку, типа вектора становится матрицей:

Vector3d vectorEigen; 
    vectorEigen << matrix3D[i][j][k].a, matrix3D[i][j][k].b, matrix3D[i][j][k].c; 

и vectorEigen становится переменной типа Eigen::Matrix<double, 3,1,0,3,1>

Кто-нибудь знает, что я пропустил здесь?

+0

C++ - это статически типизированный язык. Переменная не будет «становиться» другим типом. –

+0

Я предполагаю, что вопрос о типе 'vectorEigen' больше не является реальной проблемой. Может быть, вы боретесь с какой-то другой проблемой? На самом деле вам не нужна 'vectorEigen << matrix3D [i] [j] [k] .a << matrix3D [i] [j] [k] .b << matrix3D [i] [j] [k]. c; 'вместо' vectorEigen << matrix3D [i] [j] [k] .a, matrix3D [i] [j] [k] .b, matrix3D [i] [j] [k] .c; ' – WhiteViking

+0

'vectorEigen << matrix3D [i] [j] [k] .a << matrix3D [i] [j] [k] .b << matrix3D [i] [j] [k] .c;' дает мне ошибка, к сожалению :( Проблема возникает, когда я вызываю функцию, которая принимает входной параметр Vector3d. Подстановка 'vectorEigen' в качестве входного параметра функции заставляет компилятор жаловаться. Причиной является функция со входом типа 'Eigen :: Matrix ' не определено. – bull

ответ

0

Внутренний Eigen представляет векторы в виде матриц с одной колонкой. Таким образом, векторы (как и обычные матрицы) действительно являются экземплярами класса шаблонов Eigen::Matrix.

Для простоты по отношению к программисту Eigen использует C++ typedef для определения векторных классов, которые являются синонимами для Eigen::Matrix<> с определенными параметрами. Например, Vector3d типа в Eigen является typedef для матрицы, элементы которой являются double ы и имеет 3 строки и 1 столбец:

typedef Matrix<double, 3, 1> Vector3d 

Класс Matrix шаблона на самом деле имеет 6 аргументов шаблона, последние 3 из них является аргументы по умолчанию.Вот полная подпись:

template<typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols> 
class Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > 

Если компилятор относится к Eigen::Matrix<double, 3,1,0,3,1> в сообщениях об ошибках это говорит о Eigen::Matrix со следующими параметрами шаблона:

  • _Scalar = двойной
  • _Rows = 3
  • _Cols = 1
  • _Options = 0 (по defa щ)
  • _MaxRows = _Rows (по умолчанию) = 3
  • _MaxCols = _Cols (по умолчанию) = 1

Так Eigen::Matrix<double, 3,1,0,3,1> просто полный тип Vector3d, что компилятор видит после разрешения typedef и шаблон аргументы.

Тип не изменился вообще, вы просто используете сокращенную нотацию Vector3d в своем коде, тогда как компилятор ссылается на нее своим явным типом.

+0

Спасибо за ответ. Проблема в том, что мне нужно, чтобы 'vectorEigen' был как входной функцией, которая принимает Vector3d входной параметр. Компилятор точно жалуется на эту строку, которую вызывает функция: functionA (vectorEigen), с причиной «неопределенной ссылки», потому что тип ввода не совпадает. – bull

+0

@bull Включили ли вы правильные заголовочные файлы Eigen? Например, '#include ' (это в основном включает в себя все Eigen, который переусердствует, но может помочь вам найти проблему.) – WhiteViking

+0

Я включаю '', но только что изменился на' '. Ошибка остается, однако ... – bull

0

Если вы заинтересованы в реализации Matrix и Vector с использованием C++, вы можете полностью игнорировать мой ответ.

Но, если вам просто нужно использовать Matrix и Vector, то вы можете попробовать класс Mat и Vec в OpenCV. И here - хороший учебник о Mat.

Кроме того, если вам не обязательно использовать C++, то Octave еще удобнее.

Смежные вопросы