Лабораторная работа №6 По предмету: искусственный интелект саидов Рустам Проверил: бекмуратов. К. А
public: K_means() : q_klaster(0), k_pixcel(0) {}; K_means(int
Download 140.22 Kb.
|
ИИ ЛАБ 6
public:
K_means() : q_klaster(0), k_pixcel(0) {}; K_means(int n, rgb *mas, int n_klaster); K_means(int n_klaster, std::istream & os); void clustering(std::ostream & os); void print()const; ~K_means(); friend std::ostream & operator<<(std::ostream & os, const K_means & k); }; Пробежимся по составляющим класса: vectorpixcel — вектор для пикселей; q_klaster – количество кластеров; k_pixcel – количество пикселей; vectorcentr – вектор для центров кластеризации, количество элементов в нем определяется q_klaster; identify_centers() – метод для случайного выбора начальных центров среди входных пикселей; compute() и compute_s() встроенные методы для расчета расстояния между пикселями и пересчета центров соответственно; три конструктора: первый по умолчанию, второй — для инициализации пикселей из массива, третий — для инициализации пикселей из текстового файла (в моей реализации сначала файл случайно заполняется данными, и потом с этого файла считываются пиксели для работы программы, почему не напрямую в вектор – просто так нужно в моем случае); clustering(std::ostream & os) – метод кластеризации; метод и перегрузка оператора вывода для публикации результатов. Реализация методов: void K_means::identify_centers() { srand((unsigned)time(NULL)); rgb temp; rgb *mas = new rgb[q_klaster]; for (int i = 0; i < q_klaster; i++) { temp = pixcel[0 + rand() % k_pixcel]; for (int j = i; j < q_klaster; j++) { if (temp.r != mas[j].r && temp.g != mas[j].g && temp.b != mas[j].b) { mas[j] = temp; } else { i--; break; } } } for (int i = 0; i < q_klaster; i++) { centr.push_back(mas[i]); } delete []mas; } Это метод для выбора начальных центров кластеризации и добавления их в вектор центров. Осуществляется проверка на повтор центров и замена их в этих случаях. K_means::K_means(int n, rgb * mas, int n_klaster) { for (int i = 0; i < n; i++) { pixcel.push_back(*(mas + i)); } q_klaster = n_klaster; k_pixcel = n; identify_centers(); } Реализация конструктора для инициализации пикселей из массива. K_means::K_means(int n_klaster, std::istream & os) : q_klaster(n_klaster) { rgb temp; while (os >> temp.r && os >> temp.g && os >> temp.b) { pixcel.push_back(temp); } k_pixcel = pixcel.size(); identify_centers(); } В этот конструктор мы передаем объект ввода для возможности ввода данных как из файла, так и из консоли. Download 140.22 Kb. Do'stlaringiz bilan baham: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling