2017-07-12 5 views
0

Ich habe einen Vektor von Punkten und ich berechne die Abstände zwischen jedem Punkt (P1P2, P1P3, P1P4, .... P1PN, P2P1, ..., PMPN).
Jetzt möchte ich alle Entfernungen von Punkt 1 zu jedem anderen Punkt summieren, dann alle Entfernungen von Punkt 2 zu jedem anderen Punkt und so weiter (P1P2 + P1P3 + ... + P1PN, P2P1 + P2P2 + ... + P2PN) Setzen Sie diese Abstände in einen Vektor. Ich bin in meiner for-Schleife jetzt fest:Summe der Abstände in einer for-Schleife

Hier ist mein Code:

// Calculate mass centers 
    vector<Point2f> centroids_1; 

    // Calculate distances between all mass centers 
    vector<double> distance_vector; 


    for (int i = 0, iend = centroids_1.size(); i < iend; i++) { 
     for (int j = 0, jend = centroids_1.size(); j < jend; j++) { 
      double distance = norm(centroids_1[i] - centroids_1[j]); 
      distance_vector.push_back(distance); 
      // Here I tried many things with for loops and while loops but 
      // I couldn't find a proper solution 
     } 
    } 
+0

fügen Sie einfach einen 'std :: vector sum_distance' und innerhalb der Schleife' sum_distance [i] + = distance; '. Btw imho es wäre besser, wenn Sie zeigten, was Sie versucht haben und zu erklären, warum es nicht funktioniert hat, weil es nicht so klar ist, was das Problem hier ist – user463035818

+0

Ich wusste nur nicht die Syntax mit 'sum_distance [i] + =' und in meinem Ich habe viel mit den Iteratoren i und j versucht, aber es war eindeutig nicht die richtige Lösung. – Grillteller

Antwort

1

Verwenden Sie die Standard-Bibliothek statt roher Loops. Es wird einfacher zu lesen und zu warten sein. Plus, die Indizes sind Lärm. Sie sind nicht erforderlich für Iteration.

for(auto const& point : centroids_1) 
    distance_vector.push_back(std::accumulate(begin(centroids_1), end(centroids_1), 0.0, 
    [&](auto res, auto const& point2) { return res + norm(point - point2); } 
)); 

Insbesondere verwendeten wir eine Schleife zusammen mit range-based-forstd::accumulate. Dies ist die Beschreibung dessen, was Sie tun möchten. Speichern Sie für jeden Punkt die akkumulierte Summe der Abstände zwischen ihm und anderen Punkten.

+0

Danke! Wenn ich eine Aussage hinzufügen möchte wie: "Addiere einfach den Abstand zum Vektor, wenn er unter einer bestimmten Schwelle ist". Wo würde ich die if-Schleife einfügen oder funktioniert das auch mit der Standard-Bibliothek? Es ist schwieriger für mich zu verstehen als die Lösung unten. – Grillteller

+0

@Grillteller - Sie würden es im Konstrukt '[]() {}' hinzufügen. Das ist ein C++ - Lambda, eine Art von Funktion, die Sie inline definieren, um Ihre Operation auszuführen. Sie können jede gewünschte Logik einfügen, solange Sie das kumulierte Ergebnis am Ende (vielleicht sogar unverändert) zurückgeben. – StoryTeller

+0

@Grillteller - Und ich weiß, dass es etwas mehr über C++ liest. Aber wenn Sie einmal die Syntax dafür haben, ist es wirklich weniger laut als mit Indizes. – StoryTeller

0

Sie fügen nicht distance anywhere.After die erste Iteration der inneren Schleife, die Antwort für den ersten Punkt wäre bereit, die du kannst speichern.

Auch brauchen Sie nicht den Unterschied zwischen denselben Punkten zu finden, so überspringen, wenn i=j

for (int i = 0, iend = centroids_1.size(); i < iend; i++) 
    { 
    double distance=0.0; 
    for (int j = 0, jend = centroids_1.size(); j < jend; j++) 
     { 
      if(i==j) 
       continue; 
      distance+ = norm(centroids_1[i] - centroids_1[j]); 
     } 
     distance_vector.push_back(distance); 
    } 
} 
+0

zu viele geschlossene Auszeichnungen? – sop

Verwandte Themen