Создание Eigen :: Vector выглядеть как вектор точек - PullRequest
1 голос
/ 25 января 2012

Я хочу представить 2D-фигуру таким образом, чтобы с ней можно было взаимодействовать, как если бы это был вектор точек, в частности, я хочу иметь возможность вызывать операторы [] и at() для нее и возвращатьссылки на вещи, которые действуют как 2D точки.В настоящее время я просто использую класс, чья единственная переменная-член является вектором точек и имеет различные арифметические и геометрические операции, определенные точечно над его элементами.

Однако в других частях моего кода мне нужно обрабатывать вектор из n точек как элемент 2n-мерного пространства и выполнять над ним базовую линейную алгебру (например, проецируя вектор на данное подпространство в R ^ 2n).).В настоящее время я создаю объект Eigen::VectorXd каждый раз, когда хочу это сделать, а затем выполняю обратное преобразование после выполнения этих операций.Я не хочу этого делать, так как я делаю преобразование достаточно часто, чтобы все копирование было заметным источником неэффективности.

Если бы я хранил данные в виде плоского массива типа doubles / float / ints,Я мог бы привести указатель на его n-й элемент к указателю на Point (члены которого были бы просто парой двойных / чисел с плавающей запятой / ints).Однако, поскольку я не знаю внутреннего представления, которое Eigen использует для векторов (и оно вполне может измениться), это невозможно.

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

1 Ответ

2 голосов
/ 25 января 2012

Однако, поскольку я не знаю внутреннего представления, которое Эйген использует для векторов (и оно вполне может измениться), это невозможно.

Eigen предлагает Map классы, которые позволяют отображать простые массивы на собственные структуры. Например:

double numbers[2];
Eigen::Vector2f::Map( numbers ).dot( Eigen::Vector2f::Constant(1) );
...