248 std::vector<int> prohibited_indexes;
249 std::random_device rd;
250 std::mt19937 gen(rd());
251 std::uniform_int_distribution<> udistr(0,total_points-1);
253 if (total_points == 0)
255 std::ostringstream msg;
256 msg <<
"Division by zero: total_points == 0";
257 throw std::runtime_error(msg.str());
260 for (
int i = 0;
i <
K;
i++)
264 int index_point = udistr(gen);
266 if (
find(prohibited_indexes.begin(), prohibited_indexes.end(),
267 index_point) == prohibited_indexes.end())
269 prohibited_indexes.push_back(index_point);
270 points[index_point].setCluster(
i);
271 Cluster cluster(
i, points[index_point]);
272 clusters.push_back(cluster);
279 std::fstream savedClusters(fnClusters.c_str());
280 if (savedClusters.good())
283 for (
int i = 0;
i <
K;
i++)
285 std::getline(savedClusters, line);
286 std::stringstream ss(line);
288 for (
int j = 0;
j < total_values;
j++)
291 clusters[
i].setCentralValue(
j, point_value);
303 if ((maxObjects != -1) && (total_points > maxObjects))
305 for (
int i = 0;
i < total_points;
i++)
307 int nearest_center = getIDNearestCenter(points[
i]);
308 points[
i].setCluster(nearest_center);
309 clusters[nearest_center].addPoint(points[
i]);
315 for (
int i = 0;
i < total_points;
i++)
317 int old_cluster = points[
i].getCluster();
318 int nearest_center = getIDNearestCenter(points[
i]);
320 if (old_cluster != nearest_center)
322 if (old_cluster != -1)
323 clusters[old_cluster].removePoint(points[
i].getID());
325 points[
i].setCluster(nearest_center);
326 clusters[nearest_center].addPoint(points[
i]);
332 for (
int i = 0;
i <
K;
i++)
334 for (
int j = 0;
j < total_values;
j++)
336 int total_points = clusters[
i].getTotalPoints();
339 if (total_points > 0)
341 for (
int p = 0; p < total_points; p++)
342 sum += clusters[
i].getPoint(p).getValue(
j);
344 clusters[
i].setCentralValue(
j, sum / total_points);
349 if (done ==
true || iter >= maxIterations)
break;
391 std::ofstream saveData;
394 saveData.open(fnClusters.c_str());
395 for (
int i = 0;
i <
K;
i++)
397 for (
int j = 0;
j < total_values;
j++)
398 saveData << clusters[
i].getCentralValue(
j) <<
" ";
399 saveData << std::endl;
404 saveData.open(fnPoints.c_str());
405 for (
int i = 0;
i < total_points;
i++)
407 for (
int j = 0;
j < total_values;
j++)
408 saveData << points[
i].getValue(
j) <<
" ";
409 saveData << std::endl;
std::vector< SelLine >::iterator find(std::vector< SelLine > &text, const std::string &img_name)