Eigen :: MatrixXd to flann :: Matrix & lt; double & gt; преобразование

Предположим, что mat ниже тип Eigen::MatrixXd и уже содержит некоторые данные. В попытке избежать дублирования памяти, я попытался создать экземпляр flann::Matrix<double> Объект из указателя на необработанный кусок памяти, выделенный Eigen3:

flann::Matrix<double> input(const_cast<double *>(mat.data(), mat.rows(), mat.cols())

Тем не менее, мой алгоритм выводит мусор, но это прекрасно с уродливым:

flann::Matrix<double> input(new double[mat.rows()*mat.cols()], mat.rows(),  mat.cols());
for (int i = 0; i  < mat.rows(); i++) {
for (int j = 0; j < mat.cols(); j++) {
input[i][j] = mat(i, j);
}

}

Я исследовал вариант подкласса базы Matrix_ введите фланг, чтобы создать адаптер для матриц Eigen3. Проблема в том, что Matrix_ опирается на реализацию [] оператор в его взаимодействии. Это заставляет меня чувствовать, что я могу столкнуться с той же проблемой памяти, что и в простом (но неработающем) решении, показанном выше.

Как вы думаете, что может объяснить такое поведение?

  • Строка / столбец — основная проблема
  • Внутренняя, внешняя проблема шага
  • Несовместимость выравнивания памяти
  • Eigen::Map это сладко, но не то, что я ищу. Было бы отстой переписать мой код для использования stl::vector<std::vector<double> > в качестве базовых типов и Eigen::Map их к Eigen::MatrixXd
  • http://nanoflann-reference.mrpt.org/svn/structnanoflann_1_1KDTreeEigenMatrixAdaptor.html к сожалению, слишком далеко от базовой библиотеки libflann, чтобы ее можно было использовать.

7

Решение

Я также получил подтверждение от Мариуса Муджи, автора libflann, что flann::Matrix хранит в мажорном порядке, тогда как Eigen по умолчанию использует мажорный столбец. Вот ответ, который он дал мне по электронной почте:

Скорее всего, проблема заключается в том, что Eigen хранит матрицы в главном порядке столбцов>, в то время как FLANN требует их в главном порядке строк.

Решение было бы использовать Matrix<double, Dynamic, Dynamic, RowMajor> вместо MatrixXdтогда матрицы FLANN и Eigen могут совместно использовать одну и ту же память, в противном случае потребуется копия.
Мариус Муджа

7

Другие решения

Eigen :: Matrix постоянно хранит данные, поэтому проблем с ходом не должно быть. Выравнивание может быть проблемой, если вы пытаетесь построить Eigen :: Matrix на нем (но я не могу представить, как это возможно). По умолчанию Eigen :: Matrix является столбцом-мажором, это может быть вашей проблемой. Я не знаю, как фланны относятся к матрицам, если они мажорные, то это все. Следующий пример работы с Eigen :: Matrix< double, -1, -1, Eigen :: RowMajor> для mat и завершается неудачно с Eigen :: MatrixXd.

int k = 0;
for (int i = 0; i<mat.rows(); ++i)
{
for (int j = 0; j<mat.cols(); ++j, ++k) {
mat(i, j) = k;
}
}

double* mptr = mat.data();
for (int i = 0; i<mat.rows() * mat.cols(); ++i) {
assert(mptr[i] == i);
}

У меня нет твоей жалобы на Эйген :: Карта. Это самый хороший способ обработать некоторые данные как собственную матрицу (обратите внимание, что они по-прежнему будут основными столбцами по умолчанию), создание подклассов из матрицы или реализация пользовательского собственного выражения может быть затруднительным.

1

По вопросам рекламы [email protected]