Я на самом деле пытаюсь разобраться вектором дескриптора основывая на векторе, включенных в дескрипторестанд :: сортировать по вектору вектора
float xi, yi; // Descriptor location
vector<double> fv; // The feature vector
(здесь вектор имя бс) То, что я хочу сделать будет искать в векторе Descriptor (я буду называть его vec_Desc для большей ясности теперь) размерности, которые имеют наибольшую дисперсию сделать это, я использую:
double Tree::_get_mean(vector<Descriptor>& vec, int indice)
{
double sum = 0;
int size = vec.size();
for (int i = 0; i < size; i++) {
sum += vec[i].fv[indice];
}
sum /= size;
return sum;
}
double Tree::_get_variance(vector<Descriptor>& vec, int indice)
{
int size = vec.size();
double var = 0;
double mean = _get_mean(vec, indice);
for (int i = 0; i < size; i++) {
var += ((vec[i].fv[indice] - mean) * (vec[i].fv[indice] - mean))/size;
}
return var;
}
int Tree::choose_dimension(vector<Descriptor>& vec)
{
double var = _get_variance(vec, 0);
int indice = 0;
for (int i = 1; i < vec[0].fv.size(); i++) {
if (var > _get_variance(vec, i)) {
var = _get_variance(vec, i);
indice = i;
}
}
}
Тогда я хочу, чтобы отсортировать vec_desc на основе на тусклом я нашел. Пытался сделать так:
class _compare {
int step;
public:
_compare(int s) : step(s) {}
bool operator()(const vector<double>& p1, const vector<double>& p2) {
return p1[step] < p2[step];
}
};
void Tree::_sort_vector(vector<Descriptor>& vec, int i)
{
std::sort(vec.begin(), vec.end(), _compare(i));
}
void Tree::sort_vector(vector<Descriptor>& vec)
{
_sort_vector(vec, choose_dimension(vec));
}
Но с этим, я буду сортировать vec_desc используя свои собственные значения, а не значения, содержащиеся в бс в ... Как я могу это сделать?
Вы используете C++ 11 компилятора? Если это так, я предлагаю вам перейти на использование 'lambda' функций вместо функторов и использовать эту функцию. Вы, скорее всего, сможете более легко достичь того, чего вы пытаетесь добиться, тем самым. Кроме того, нехорошо начинать ваши имена с подчеркивания. – PaulMcKenzie
Этот 'std :: sort (vec.begin(), vec.end(), _compare (i));' не должен компилироваться, поскольку '_compare :: operator()' принимает 'vector', а не 'Descriptor '! Или есть оператор для преобразования 'Descriptor' в' vector '? Кажется, вы не показываете весь код. –
iksemyonov
См. Здесь: [cppreference [(http://en.cppreference.com/w/cpp/algorithm/sort) "* Типы' Type1' и 'Type2' должны быть такими, что объект типа« RandomIt' может быть разыменованные, а затем неявно преобразованные в оба из них. * « – iksemyonov