c++ - Eigen::MatrixXd 到 flann::Matrix<double> 的转换

标签 c++ stl matrix nearest-neighbor eigen

假设下面的 matEigen::MatrixXd 类型并且已经包含一些数据。为了避免重复内存,我尝试从指向 Eigen3 分配的原始内存块的指针实例化一个 flann::Matrix 对象:

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);
}

}

我研究了从 flann 子类化基本 Matrix_ 类型以创建 Eigen3 矩阵的适配器的选项。但问题是 Matrix_ 依赖于其交互中 [] 运算符的实现。这让我觉得我可能会遇到与上面显示的简单(但损坏)解决方案相同的内存问题。

你认为什么可以解释这种行为?

最佳答案

我还得到了 libflann 的作者 Marius Muja 的确认,即 flann::Matrix 以行优先顺序存储,而 Eigen 默认使用列优先。这是他通过电子邮件给我的答案:

The problem is most likely the fact that Eigen stores matrices in column-major order > while FLANN requires them in row-major order.

A solution would be to use Matrix<double, Dynamic, Dynamic, RowMajor> instead of MatrixXd, then FLANN and Eigen matrices can share the same memory, otherwise a copy will be needed. Marius Muja

关于c++ - Eigen::MatrixXd 到 flann::Matrix<double> 的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13465890/

相关文章:

c++ - 将const std::vector <std::string>转换为const char **

c++ - 在由Dev C++编译后,为什么在PE文件中还有很多其他部分?

c++ - 什么时候使用 std::multimap 有意义

c++ - 像素完美的投影矩阵?

c++ - 堆喷射攻击是如何工作的?

c++ - 为什么这段代码会从std::cin读入一个无限循环中

c++ - 如何从列表中找到以“b”开头的单词和带有4个符号的单词?

c++ - 按字符串长度对CMap键进行排序

python - 将两个具有不同维度的矩阵相加,并在总矩阵中保留标签

python - 将 scipy 稀疏行矩阵添加到另一个稀疏矩阵