0

我正在使用 kmean 函数将 8-D 向量聚类为一组簇:

 kmeans(Vectors, clusterCount, labels, TermCriteria(CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 100, 2), 10, KMEANS_PP_CENTERS, centers);

对我来说,最成功的集群是包含更多向量的集群。所以我的问题是如何找到人口最多的集群?label param是每个向量所属的指标,我感觉如果用它来查找频率会消耗时间。有没有人可以提出一个想法?

传统上,我执行以下任务:

int max = -1;int index = -1;
vector<int> classes;
classes.resize(clusterCount);
for (int i=0;i<labels.rows;i++)
{
  int idx = labels.at<int>(i,0);
  classes[idx]++;
  if (classes[idx] > max)
  {
    max = classes[idx];
    index = idx;
 }
}

有比这更快的解决方案吗?

4

1 回答 1

0

我正在寻找相同的东西,但还没有发现任何(还)有很大不同的东西,但是你可以加快你的代码:

  • 不要每次都更新你的最大值
  • 避免使用中间变量(比如你的int idx

这是我的代码:

int classes[clusterCount];
memset(classes, 0, sizeof(classes[0]) * clusterCount);
int * labels_ptr = labels.ptr<int>(0);
for (int i = 0; i < labels.rows; ++i)
    classes[*labels_ptr++]++;
for (int i = 0; i < clusterCount; ++i)
    {
    if (classes[i] > max)
        {
        max = count[i];
        index = i;
        }
    }

这段代码给出的结果与你的相同,在我的电脑(英特尔酷睿 i7)上,比你提供的代码快大约5 倍(在不同的图像上测试了 1000 次运行)。

于 2014-05-26T11:10:13.763 回答