C++ 中最有效的矩阵表示是什么?

jus*_*rld 5 c++ opencv matrix vlfeat

我希望这个问题不是 OT。

我正在使用VLFeat 实现和来自不同实现的SIFT描述符来实现VLAD编码器,以比较它们(OpenCV、VLFeat、OpenSIFT)。

这应该是 C++ 中的高性能应用程序(我知道 SIFT 效率非常低,我正在实现它的并行版本)。

现在,VLAD 想要将指向一组连续描述符(数学向量)的指针作为输入。关键是通常这个 SIFT 描述符被表示为一个矩阵,所以更容易管理它们。

所以假设我们有一个由 3 个维度的 3 个描述符组成的矩阵(为了简单起见,我使用这些数字,实际上它是 128 个维度的数千个描述符):

1 2 3
4 5 6
7 8 9
Run Code Online (Sandbox Code Playgroud)

我需要vl_vlad_encode用指针来做饲料:

1 2 3 4 5 6 7 8 9
Run Code Online (Sandbox Code Playgroud)

一个简单的解决方案是将描述符保存在一个cv::Mat m对象中,然后传递m.datavl_vlad_encode.

但是我不知道是否cv::Mat是有效的矩阵表示。例如,Eigen::Matrix是另一种选择(我认为使用这个对象很容易获得上面的表示),但我不知道哪个实现更快/更有效,或者是否有任何其他原因,因为我应该更喜欢一个而不是另一个.

另一种可能的替代方法是使用std::vector<std::vector<float>> v,但我不知道使用v.data()我是否会获得上面的表示而不是: 1 2 3 *something* 4 5 6 *something* 7 8 9

显然*something*会搞砸vl_vlad_encode

任何其他建议都非常受欢迎!

Mik*_*iki 5

除非你做了一些奇怪的事情(详见这里), aMat中的数据保证是连续的。您可以将 aMat视为 a float*(或其他类型)的轻量级包装器,可以更轻松地访问数据。所以它和指针一样有效,但有一些很好的抽象。

如果您需要高效地从/到文件加载/保存,您可以Mat使用matreadmatwrite以二进制格式保存。