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

时间:2016-12-14 11:10:12

标签: c++ opencv matrix vlfeat

我希望这个问题不是OT。

我使用来自不同实现的VLADVLFeat implementation描述符来实现SIFT编码器以进行比较(OpenCV,VLFeat,OpenSIFT)。

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

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

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

1 2 3
4 5 6
7 8 9

我需要使用指向<{p>>的指针来执行vl_vlad_encode

1 2 3 4 5 6 7 8 9

一个简单的解决方案是在cv::Mat m对象中保存描述符,然后将m.data传递给vl_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

欢迎任何其他建议!

2 个答案:

答案 0 :(得分:4)

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

如果您需要有效地加载/保存文件,您可以使用matread and matwrite以二进制格式保存Mat

答案 1 :(得分:1)

如果没有一些努力,

std::vector<std::vector<float>> v将无法很好地执行,因为内存不会是连续的。

一旦你的内存连续,无论是float [],float [] []还是std :: array / vector,它的执行效果取决于你如何迭代你的矩阵。如果它是随机访问,那么它几乎没有区别;如果您为每个列重复所有列,那么最好按列而不是按行对数据进行分组。