Предположим, что 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
Я также получил подтверждение от Мариуса Муджи, автора libflann, что flann::Matrix
хранит в мажорном порядке, тогда как Eigen по умолчанию использует мажорный столбец. Вот ответ, который он дал мне по электронной почте:
Скорее всего, проблема заключается в том, что Eigen хранит матрицы в главном порядке столбцов>, в то время как FLANN требует их в главном порядке строк.
Решение было бы использовать
Matrix<double, Dynamic, Dynamic, RowMajor>
вместоMatrixXd
тогда матрицы FLANN и Eigen могут совместно использовать одну и ту же память, в противном случае потребуется копия.
Мариус Муджа
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);
}
У меня нет твоей жалобы на Эйген :: Карта. Это самый хороший способ обработать некоторые данные как собственную матрицу (обратите внимание, что они по-прежнему будут основными столбцами по умолчанию), создание подклассов из матрицы или реализация пользовательского собственного выражения может быть затруднительным.