1

这些天来,我一直在研究 C-mex 代码,以提高 DBSCAN matlab 代码的速度。事实上,此刻我在 C-mex 上完成了 DBSCAN。但相反,我的测试数据是 3 x 14414 矩阵,它需要更多时间(matlab 中为 14.64 秒,C-Mex 中为 53.39 秒)。我认为这是由于mxRealloc在我的代码的几个部分中使用了函数。如果有人给我一些建议以获得更好的结果,那就太好了。

这是代码 DBSCAN1.c:

https://www.dropbox.com/sh/mxn757a2qmniy06/PmromUQCbO

4

1 回答 1

2

在循环的每次迭代中使用mxRealloc确实是性能杀手。您可以改用vector或类似的类。在您的距离函数中根本不需要动态分配。

如果您的目标不是将 DBSCAN 实现为 mex,而是加快速度,我将为您提供不同的解决方案。我不知道您使用的是哪个 Matlab 实现,但您不会通过以相同方式将其重写为 C 来更快地实现简单的 n^2 实现。大部分时间都花在计算最近的邻居上,这在 C 中不会比在 Matlab 中更快。DBSCAN 可以通过使用索引结构在 nlogn 时间内运行以获取最近的邻居。

对于我的应用程序,我正在使用dbscan 的这种实现,但我已将最近邻居的计算更改为使用 KD-tree(可在此处获得)。加速对于我的应用程序来说已经足够了,不需要重新实现。我认为无论你写得多么好,这都会比任何 n^2 c 实现更快。

于 2013-01-31T09:54:54.223 回答