Массив с плавающей точкой как вектор Eigen :: Vector3f - PullRequest
0 голосов
/ 19 сентября 2019

Я пишу Eigen на GPU и хотел бы использовать Eigen.У меня есть float*, которые представляют триплеты данных (например, xyz, rgb и т. Д.) Известного размера n.Я хотел бы использовать их как собственный вектор, но только с приведением (без копирования памяти, как я на устройстве), например:

const float* input=...
Eigen::Vector3f* inputAsFloat = ????

Ответы [ 2 ]

1 голос
/ 25 сентября 2019

Мои предпочтения (хотя предыдущие ответы, вероятно, также верны):

Создайте карту для исходного массива, а затем выполните итерации по сегментам фиксированного размера.Предположительно, 'n' кратно 3.

float* input;
int n;

Eigen::Map<VectorXf> vector_map(input,n);
   for(int i = 0; i < n/3; i++)
   {
   const Vector3f& eigen_3f = vector_map.segment<3>(3*i);
   //do things with eigen_3f
   }

Вам не нужно создавать ссылку на 'vector_map.segment <3> (3 * i)', но я думаю, что это иллюстрируетточка.

1 голос
/ 19 сентября 2019

Вы можете использовать Eigen::Map для создания представления массива данных:

float* raw_data = ....;
Eigen::Map<Vector3f> vector_map(raw_data, raw_data_size);

Существуют различные варианты, которые вы можете использовать:

  • Первый аргумент шаблона - это тип данных Eigen, который вы эмулируете.
  • Второй аргумент шаблона - это мажор строки / столбца
  • Третий аргумент шаблона - это опция шага, т. Е. Насколько далеко друг от друга находятся элементы и строки / столбцы в памяти.(например, для дополнительного заполнения на строку)

Не совсем уверен, насколько хорошо это взаимодействует с GPU и / или CUDA.

...