clusters.erase
时间: 2023-10-23 19:12:50 浏览: 96
非常抱歉,我的回答里有误,`clusters.erase`应该改为`clusters.erase(clusters.begin() + minCluster2)`。这是因为 `clusters` 是一个 `vector`,我们需要使用 `vector` 的 `erase` 函数来删除其中的元素。
完整的代码如下:
```c++
#include <iostream>
#include <vector>
#include <cmath>
#include <limits>
using namespace std;
struct DataPoint {
double value;
int cluster;
};
double getDistance(const DataPoint& p1, const DataPoint& p2) {
return fabs(p1.value - p2.value);
}
void mergeClusters(vector<DataPoint>& data, int cluster1, int cluster2) {
for (auto& point : data) {
if (point.cluster == cluster2) {
point.cluster = cluster1;
}
}
}
void hierarchicalClustering(vector<DataPoint>& data) {
int n = data.size();
vector<int> clusters(n);
for (int i = 0; i < n; ++i) {
clusters[i] = i;
}
while (n > 1) {
double minDist = numeric_limits<double>::max();
int minCluster1 = -1, minCluster2 = -1;
for (int i = 0; i < n-1; ++i) {
for (int j = i+1; j < n; ++j) {
double dist = getDistance(data[i], data[j]);
if (dist < minDist) {
minDist = dist;
minCluster1 = clusters[i];
minCluster2 = clusters[j];
}
}
}
mergeClusters(data, minCluster1, minCluster2);
clusters.erase(clusters.begin() + minCluster2);
for (auto& point : data) {
if (point.cluster > minCluster2) {
--point.cluster;
}
}
--n;
}
}
int main() {
vector<DataPoint> data = {{1.0, 0}, {2.0, 1}, {5.0, 2}, {6.0, 3}, {7.0, 4}, {8.0, 5}};
hierarchicalClustering(data);
for (const auto& point : data) {
cout << point.value << " " << point.cluster << endl;
}
return 0;
}
```
该程序可以将输入的数据按照差值进行聚类,并输出每个数据点所属的簇的编号。输入的数据是一个包含六个数据点的向量,每个数据点包含数据本身和所属的簇的编号。在程序中,我们首先对每个数据点初始化一个簇的编号,然后进行层次聚类,最终得到每个数据点所属的最终簇的编号。
阅读全文