2016-02-24 3 views
1

Я на самом деле пытаюсь разобраться вектором дескриптора основывая на векторе, включенных в дескрипторестанд :: сортировать по вектору вектора

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 используя свои собственные значения, а не значения, содержащиеся в бс в ... Как я могу это сделать?

+1

Вы используете C++ 11 компилятора? Если это так, я предлагаю вам перейти на использование 'lambda' функций вместо функторов и использовать эту функцию. Вы, скорее всего, сможете более легко достичь того, чего вы пытаетесь добиться, тем самым. Кроме того, нехорошо начинать ваши имена с подчеркивания. – PaulMcKenzie

+0

Этот 'std :: sort (vec.begin(), vec.end(), _compare (i));' не должен компилироваться, поскольку '_compare :: operator()' принимает 'vector ', а не 'Descriptor '! Или есть оператор для преобразования 'Descriptor' в' vector '? Кажется, вы не показываете весь код. – iksemyonov

+0

См. Здесь: [cppreference [(http://en.cppreference.com/w/cpp/algorithm/sort) "* Типы' Type1' и 'Type2' должны быть такими, что объект типа« RandomIt' может быть разыменованные, а затем неявно преобразованные в оба из них. * « – iksemyonov

ответ

1

Вашего компаратор неверно - так как вы сортировка vector<Descriptor> он должен сравнить два экземпляра Descriptor не vector<double>:

class _compare { 
    int step; 
public: 
    _compare(int s) : step(s) {} 

    bool operator()(const Descriptor& d1, const Descriptor& d2) const { 
     return d1.fv[step] < d2.fv[step]; 
    } 
}; 
+0

Oooooh да! Я немного глуп, решение было очевидно! Спасибо большое! :) –

Смежные вопросы