2

我正在写kmeans算法。我需要一些 2d 动态容器来存储点组。这里有一些代码

void KMeans::initialPartitionPoints()
{
    QTime time = QTime::currentTime();
    qsrand((uint)time.msec());
    for (int i = 0; i < numberOfClusters(); i++)
    {
        qint64 randomValue = qrand() % _points->size();
        _centroids.push_back(new Centroid(_points->at(randomValue)));
    }

    for (int i = 0; i < _points->size(); i++)
    {
        int cluster;
        qreal bestDistance = std::numeric_limits<qreal>::max();
        qreal distance;
        for (int j = 0; j < _centroids.size(); j++)
        {
            distance = _distanceMeasure->calculateDistance(_centroids.at(j), _points->at(i));
            if (distance < bestDistance)
            {
                bestDistance = distance;
                cluster = j;
            }
        }
        WHAT HERE TO STORE i POINT IN j GROUP?
    }
}

_centroids- 是作为组中心的点列表

_points- 是所有点的列表

现在,我如何才能QList< QList<Point*> > _clusters将点存储在集群中,其中列数在构造函数中给出,并且每列的元素(行)数是未知的。我的意思是如何初始化第一个 QList 并设置元素数量,然后如何将第二个 QList 用作动态(自动调整大小)容器(QList::append())

cluster是一个组号,其中_centroids[cluster]与这个相同的组_clusters[cluster][somePoint]

4

1 回答 1

2

你可以使用QList< QList<Point*> >,它会工作。您需要手动将每一项添加到所有列表中。

但是我认为如果您不需要在任意位置插入项目并从列表中删除任意项目,则应该使用 QVector 而不是 QList。QVector 可以使用resize(). 通过索引获取和设置元素更快。内存消耗较低。

还可以考虑使用Point而不是Point*作为模板类型。应尽可能使用自动内存管理。

例子:

QVector< QVector<Point> > matrix(row_count);
for(int row = 0; row < row_count; i++) {
  matrix[row].resize(column_count);
}
//...
matrix[row][column] = some_value;
于 2013-10-01T23:21:27.643 回答