我正在写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]
属于同一组。
答案 0 :(得分:2)
您可以使用QList< QList<Point*> >
,它会起作用。您需要逐个手动将每个项目添加到所有列表中。
但是如果您不需要在任意位置插入项目并从列表中删除任意项目,我认为您应该使用QVector而不是QList。可以使用resize()
轻松调整QVector的大小。按索引获取和设置元素更快。内存消耗较低。
另请考虑使用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;