这些天我一直在研究 C-mex 代码,以提高 DBSCAN matlab 代码的速度。事实上,此刻我在 C-mex 上完成了 DBSCAN。但是相反,我的测试数据是一个矩阵 3 x 14414,它需要更多时间(matlab 中为 14.64 秒,C-Mex 中为 53.39 秒)。我认为这是由于使用了 mxRealloc
函数在我的代码的几个部分。如果有人给我一些建议以获得更好的结果,那就太好了。
这里是 DBSCAN1.c 的代码:
最佳答案
在循环的每次迭代中使用 mxRealloc
确实是性能 killer 。您可以改用 vector
或类似的类。您的距离函数根本不需要动态分配。
如果您的目标不是将 DBSCAN 实现为 mex,而是为了加速它,我将为您提供不同的解决方案。 我不知道您使用的是哪种 Matlab 实现,但您不会通过以相同的方式将其重写为 C 来更快地创建一个简单的 n^2 实现。大多数时间都花在计算最近的邻居上,这在 C 中不会比在 Matlab 中更快。通过使用索引结构获取最近的邻居,DBSCAN 可以在 nlogn 时间内运行。
对于我的应用程序,我使用 this dbscan 的实现,但我已将最近邻居的计算更改为使用 KD 树 (available here)。加速对我的应用程序来说已经足够了,不需要重新实现。我认为这将比任何 n^2 c 实现都快,无论你写得有多好。
关于c - 多少 mxRealloc 可以影响 C-Mex matlab 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14591963/