Делаем Eigen :: Vector похожим на вектор точек

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

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

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

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


person theotherphil    schedule 25.01.2012    source источник


Ответы (1)


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

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

double numbers[2];
Eigen::Vector2f::Map( numbers ).dot( Eigen::Vector2f::Constant(1) );
person thiton    schedule 25.01.2012
comment
Спасибо. С другой стороны, гарантируется ли непрерывность данных плотной матрицы? т.е. безопасно ли предположить, что mat ‹T, a, b› .data () возвращает указатель на массив Ts? - person theotherphil; 25.01.2012
comment
@ user967771: Я так думаю (по определению плотной матрицы), но у меня нет доказательств. Член data PlainObjectBase не имел бы смысла без непрерывного хранения. - person thiton; 25.01.2012
comment
Похоже, что это так. Спасибо. - person theotherphil; 26.01.2012