1

最近は、DBSCAN matlab コードの速度を向上させるために、C-mex コードに取り組んでいました。実際、現時点では、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実装をはるかに高速にすることはできません。ほとんどの時間は最近傍の計算に費やされますが、これは Matlab よりも C の方が高速ではありません。DBSCAN は、インデックス構造を使用して最近傍を取得することにより、nlogn 時間で実行できます。

私のアプリケーションでは、このdbscan の実装を使用していますが、最近傍の計算を KD ツリー (ここで入手可能) を使用するように変更しました。私のアプリケーションでは高速化は十分であり、再実装は必要ありませんでした。どんなにうまく書いても、これはどの n^2 c 実装よりも高速になると思います。

于 2013-01-31T09:54:54.223 に答える