使用kd_tree和BBF进行SIFT匹配反而比暴力匹配更慢??

以下是问题的描述,但是可以总结为一句话,一般情况下,我测试使用kd_tree和BBF算法,按理说应该会优化时间和效率,但是却比直接匹配满了一个数量级,为什么????求解
使用的是64位R2014a,64位windows7的系统
我使用Matlab写使用KD_tree和BBF算法检索两张图片之间的最近邻点和次近邻点,但是理论上应该是比穷尽线性搜索快很多才对,结果却将近慢了一个数量级。求助,为什么啊。
一开始是使用的递归版本的查找,后来发现递归的慢很多,就改成迭代版本的,时间快了一些,但是总体还是慢。
测试的时候,我生成两个随机矩阵都是1000x128的矩阵分别是X1,X2,代表两张含有1000个128维特征点的图片
测试结果:
方法1. 暴力线性查找:将X1中每个特征点xi 与X2中每个特征点的欧氏距离计算出来,再使用matlab自带的sort函数进行排序,取最小的两个点。上面过程迭代1000次,找出X1中的每个特征点在X2中的最近邻点与次近邻点。结果显示,时间消耗约为 1.5s,其中1000000次计算距离消耗了90%的时间,1000次排序尽然只消耗了3.3%的时间。好吧,服了。
方法2. 使用kd_tree算法。建立树需要0.2s左右,整个查询时间需要78s,我简直要哭了,不是说kd_tree在高维情况下最差也只是与线性相持么,不过查找函数是使用递归写的。
方法3. 使用kd_tree+BBF算法+递归实现。建立树需要0.08s左右,查找过程需要15s左右,最大回溯次数为100次,其中最小优先队列是使用最小堆结构进行插入更新实现的,而查找k个邻近点是使用容量为k的最大堆实现的。
方法4. 使用kd_tree+BBF算法+迭代实现。查找过程需要10s左右,只是把递归改成了迭代。其他的都没有变。
而最不解的是,本来最不费时间的判断和比较缺耗费了大量时间,比如250000次if判断竟然花费了1.5s,但是我把这个语句单独循环这么多次,结果只需要约0.005s的时间啊。有人说函数调用可能会导致较大的时间开销,然后我就把所有函数全写在一个文件里,这样就没有函数调用了,但是结果竟然也是十多秒。

不太懂MATLAB,看很多人说用MATLAB优化算法不如C或者C++,最近被这个弄得很郁闷,希望明白的人提示一下。

回答:matlab不是高手的话,请用C或者C++来编写程序测试。从你所描述的大概猜测你写的代码效率很低

你可能感兴趣的:(机器学习,matlab)