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

What is the most efficient matrix representation in C++?

希望这道题不是OT

我正在实施 VLAD encoder using the VLFeat implementation and SIFT descriptors from different implementations to compare them (OpenCV, VLFeat, OpenSIFT)。

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

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

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

1 2 3
4 5 6
7 8 9

我需要使用指向的指针执行 feed vl_vlad_encode

1 2 3 4 5 6 7 8 9

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

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

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

显然 *something* 会搞砸 vl_vlad_encode

欢迎任何其他建议!

std::vector<std::vector<float>> v 如果不付出一些努力就不会表现很好,因为内存不会连续。

一旦你的内存是连续的,无论是 float[]、float[][] 还是 std::array/vector,它的性能将取决于你如何迭代矩阵。如果是随机访问,那没什么区别;如果您要迭代所有列,那么最好按列而不是按行对数据进行分组。

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

如果您需要高效地 load/save from/to 文件,您可以使用 .

以二进制格式保存 Mat