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
希望这道题不是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