2014-11-14 4 views
-1

Я пытаюсь написать программу с кластером класса, который имеет вектор вектора удвоений. Когда вы пытаетесь найти Centroid (средняя точка), я получаю сообщение об ошибке.Многомерный векторный индекс за пределами допустимого диапазона

Идея состоит в том, чтобы получить значение первой координаты, затем второй, третьей и т. Д. Из каждой координаты в массиве усредняйте их и вставьте их в объект централизованного объекта, а затем верните его.

код, чтобы найти центр тяжести находится ниже

vector<double> Cluster::getCentroid() 
{ 

    double temp; 


    for(int i=0; i<cluster[i].size();i++) 
    { 
     temp=0; 

     for(int j=0;j<cluster.size();j++) 
     { 
      temp+=cluster[j][i]; 
     } 
     centroid.push_back(temp/cluster.size()); 
    } 

return centroid; 

} 

где медианы вектор, частный член класса кластеров.

Ошибка я получаю:

«выражение: индекс вне диапазона»

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

+0

где медианы объявлена? –

+1

В этой строке 'for (int i = 0; i

ответ

0

Вы должны проверить размер перед доступом к элементу, поэтому, похоже, вы инвертируете свой цикл.
Следующие действия могут помочь:

std::vector<double> Cluster::getCentroid() 
{ 
    std::vector<double> centroid; 
    for (int i = 0; i != cluster.size(); i++) 
    { 
     double temp = 0; 

     for (int j=0; j != cluster[i].size(); j++) 
     { 
      temp+=cluster[i][j]; 
     } 
     centroid.push_back(temp/cluster.size()); 
    } 
    return centroid; 
} 

И вы можете упростить его, используя STL:

std::vector<double> Cluster::getCentroid() 
{ 
    std::vector<double> centroid; 
    for (const auto& c : cluster) { 
     centroid.push_back(std::accumulate(c.begin(), c.end(), 0.0)/cluster.size()); 
    } 
    return centroid; 
} 
+0

@MattMcNabb: Исправлено, спасибо. (Но не уверен, что такое реальный делитель, который хочет OP). – Jarod42

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