Pie*_*con 7 c++ stl matrix nearest-neighbor eigen
假设mat下面是类型Eigen::MatrixXd并且已经包含一些数据.为了避免重复内存,我尝试flann::Matrix<double>从指向Eigen3分配的原始内存块的指针实例化一个对象:
flann::Matrix<double> input(const_cast<double *>(mat.data(), mat.rows(), mat.cols())
Run Code Online (Sandbox Code Playgroud)
但是,我的算法输出垃圾,但丑陋得很好:
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);
}
Run Code Online (Sandbox Code Playgroud)
}
我研究了Matrix_从flann 子类化基类型的选项,以创建到Eigen3矩阵的适配器.但问题是Matrix_依赖于[]运算符在其interace中的实现.这让我觉得我可能会遇到与上面显示的简单(但破坏)解决方案相同的内存问题.
您认为可以解释这种行为?
Eigen::Map很甜蜜,但不是我想要的.我很难重写我的代码以stl::vector<std::vector<double> >用作基类型和Eigen::Map它们Eigen::MatrixXd我还得到了libflann的作者Marius Muja的确认,它flann::Matrix以行主要顺序存储,而Eigen默认使用column-major.以下是他通过电子邮件给我的答案:
问题很可能是Eigen以列主顺序存储矩阵的事实>而FLANN要求它们按行主顺序排列.
一个解决方案是使用
Matrix<double, Dynamic, Dynamic, RowMajor>而不是MatrixXd,然后FLANN和Eigen矩阵可以共享相同的内存,否则将需要一个副本.马吕斯穆贾
Eigen::Matrix 连续存储数据,因此您不应该遇到跨步问题。如果您尝试在其上构造 Eigen::Matrix ,则对齐可能是问题(但我无法想象这是如何可能的)。默认情况下 Eigen::Matrix 是列主的,这可能是您的问题。我不知道 flann 如何处理矩阵,如果它们是行优先的,那就这样了。以下示例使用 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);
}
Run Code Online (Sandbox Code Playgroud)
我没有收到您对 Eigen::Map 的抱怨。这是将某些数据视为特征矩阵的最好方法(请注意,默认情况下它仍然是列主),从矩阵子类化或实现自定义特征表达式可能会很痛苦。
| 归档时间: |
|
| 查看次数: |
2764 次 |
| 最近记录: |