2013-10-01 2 views
2

Я пишу алгоритм kmeans. Мне нужен некоторый 2d динамический контейнер для хранения групп точек. Вот некоторый код2-мерный динамический контейнер qt

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].

ответ

1

Вы можете использовать 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; 
Смежные вопросы