c - 多少 mxRealloc 可以影响 C-Mex matlab 代码?

标签 c matlab data-mining cluster-analysis dbscan

这些天我一直在研究 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

最佳答案

在循环的每次迭代中使用 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/

相关文章:

python - 我们可以从Python程序运行Orange吗

c - 到 "head"还是不到 "head"?

c++ - 从十六进制中获取 LSB 的值(C 代码)

r - 使用 matlab 计算多变量情况下的偏正态分布

Matlab:使用 fplot 绘制多个匿名函数

machine-learning - 篮球统计数据的预测算法

c - opencl中循环的时间测量

arrays - 二维数组的取消引用问题

matlab - 具有滑动窗口元素的矩阵

c++ - DLIB 是用于在 C++ 中开发我自己的机器学习算法的良好开源库吗?