алгоритм — найти ближайшие значения переполнения стека

Я прочитал из файла набор данных значений RGB, я пытаюсь закодировать алгоритм K означает, что мне нужно найти самые близкие значения в наборе данных, состоящие из трех чисел (3 значения), любой из вас может помочь мне показать мне, как сделать это?

Я новичок в программировании, поэтому, пожалуйста, будьте осторожны со злоупотреблениями: L

Спасибо за ваше время

Этот код ниже читает в файле:

#include "stdafx.h"#include <iostream>;
#include <fstream>;
#include <string>;
#include <cstdlib>;

using namespace std;

class rgb {

public:

int r;
int g;
int b;

};int _tmain(int argc, _TCHAR* argv[])
{

char filename[2000];

ifstream infile;
infile.open("file.txt");

if (infile.fail()) {

cerr << "something went wrong :(" << endl;
system("pause");
exit(1);

}

rgb array[500];

cout << "reading in file: " << endl;

for (int i = 0; i < 500; i++)
{
infile >> array[i].r >> array[i].g >> array[i].b;

cout << "r: " << array[i].r << "    ";
cout << "g: " << array[i].g << "    ";
cout << "b: " << array[i].b << "    " << endl;
}

Затем этот код находит самое близкое значение в наборе данных к центроиду один (значение 1), но читайте дальше, и вы увидите, что мне действительно нужно, внизу. Этот код был практикой, вероятно, есть лучшие способы сделать это: L

    int num = 180; // random value assigned at 180
int centroid1x;
int distance = 400;
for (int i = 0; i < 500; i++)
{if (abs(num - array[i].r) <= distance)
{
distance = abs(num - array[i].r);
centroid1x = array[i].r;
}cout << centroid1x << "    " ;

}
cout << endl << endl;

int centroid1y;
distance = 400;
for (int i = 0; i < 500; i++)
{if (abs(num - array[i].g) <= distance)
{
distance = abs(num - array[i].g);
centroid1y = array[i].g;
}

cout << centroid1y << "    " ;

}
cout << endl << endl;

int centroid1z;
distance = 400;
for (int i = 0; i < 500; i++)
{if (abs(num - array[i].b) <= distance)
{
distance = abs(num - array[i].b);
centroid1z = array[i].b;
}

cout << centroid1z << "    " ;

}
cout << endl << endl;

cout << "The closest x axis of centroid one is: " << centroid1x << endl;
cout << "The closest y axis of centroid one is: " << centroid1y << endl;
cout << "The closest z axis of centroid one is: " << centroid1z << endl << endl;

cout << "The closest point to centroid one is " << centroid1x << "." << centroid1y << "." << centroid1z << endl;
system("pause");

return 0;
}

Мне нужно, чтобы код нашел все числа, которые ближе к 180, и все числа, которые ближе к 40, и все числа, которые ближе к 100.

-1

Решение

Ваш вопрос не очень ясен, и это может быть не то, что вы хотите, но я все равно попробую.

Я думаю, у вас есть массив значений RBG и несколько центроидов, возможно, три, которые также являются значениями RGB. Для каждого значения RBG в массиве вы хотите знать, какой центроид является ближайшим. Это эффективно разделит ваш массив на столько под-массивов, сколько имеется центроидов.

Вы можете создать отдельные массивы для каждого центроида. Я видел, что вы используете C ++, хотя и со многими идиомами языка Си. Например, вы используете массив фиксированного размера вместо std::vector,

Я держал свое решение близко к этому. Вместо предоставления дополнительных массивов, я расширил rgb класс, так что он принимает целочисленную ссылку на ближайший центроид. split Функция назначает это значение.

Расстояние между значениями RGB измеряется как пространственное расстояние, как если бы значения красного, зеленого и синего были значениями x, y, z в трехмерном пространстве.

Приведенный ниже код использует предварительно определенный массив из 12 значений RGB и для краткости опускает чтение списка из файла. Центроиды чисто красные, зеленые и синие, но теоретически они могут быть где угодно.

#include <iostream>

struct rgb {
int r;
int g;
int b;
int ref;    // reference index of closest centroid
};

char hexdigit(int x)
{
if (x < 0) return '?';
if (x < 10) return '0' + x;
if (x < 16) return 'a' + x - 10;
return '?';
}

std::ostream &operator <<(std::ostream &os, rgb const &x)
{
return os << '#'
<< hexdigit(x.r / 16) << hexdigit(x.r % 16)
<< hexdigit(x.g / 16) << hexdigit(x.g % 16)
<< hexdigit(x.b / 16) << hexdigit(x.b % 16);
}

void split(rgb pool[], size_t npool, rgb const cent[], size_t ncent)
{
for (size_t i = 0; i < npool; i++) {
rgb *p = pool + i;
int dmin = 4*255*255;

for (size_t j = 0; j < ncent; j++) {
rgb const *c = cent + j;
int rr = p->r - c->r;
int gg = p->g - c->g;
int bb = p->b - c->b;
int dd = rr*rr + gg*gg + bb*bb;

if (dd < dmin) {
p->ref = j;
dmin = dd;
}
}
}
}

int main(int argc, char* argv[])
{
rgb data[12] = {
{106,  92,  69},
{135,  16, 137},
{208, 204, 220},
{ 11,  52, 120},
{ 33,  57,  81},
{196, 199, 192},
{236, 237,  85},
{ 89,  27, 225},
{173,  74, 158},
{220,   2,  66},
{171, 145, 204},
{221,  60, 235}
};

rgb cent[3] = {
{255, 0, 0},
{0, 255, 0},
{0, 0, 255}
};

split(data, 12, cent, 3);

for (int i = 0; i < 12; i++) {
std::cout << data[i] << "    " << cent[data[i].ref] << std::endl;
}

return 0;
}
0

Другие решения


По вопросам рекламы [email protected]