Werte in Martix vergleichen
-
Hallo,
ich bräuchte einen anderen Ideenansatz.
Ich will Werte einer Martix vergleichen, aber nur jedes Paar 1x.
Beispiel Matrix
3 5
2 1Verglichen soll so
3 < 5
3 => 2
3 => 1
5 => 2
5 => 1
2 < 1danach soll ein Verhähltnis ausgegeben werden 1/6
Die Martix ist aber größer als bei dem simplen Beispiel.
Mein Ansatz war der hier
(ist nur ein Auszug)int Zaehler = 0; int Nenner = 0; if(zeilen%2==0 && spalten%2==0){ for(unsigned int x = 0; x != zeilen; x++) { for(unsigned int y = 0; y != spalten; y++) { while (Bild[x][y] != Bild[x][y]){ if(Bild[x][y]<Bild[x][y+1]){ Zaehler ++; if(Bild[x][y]<Bild[x+1][y+1]){ Zaehler ++; if(Bild[x][y]<Bild[x+1][y]){ Zaehler ++; }else {Nenner ++;} }else {Nenner ++;} }else {Nenner ++;} cout << Zaehler << "/" << Nenner; } fp << Zaehler <<"/"<< Nenner; //in eine Datei speichern } } }
-
Was genau soll getan werden? Soll festgestellt werden, ob die Spirale von innen nach außen eine monoton steigende Folge ist? Beschreibe den Algorithmus genauer, dann ist die Implementierung wahrscheinlich trivial.
-
hmm genauer beschreiben...
vielleicht durch ein größeres Beispiel?!
Matrix
2 3 4 1
4 2 8 8
6 1 3 9Vergleich
2<3 2<4 2>1 2<4 2=2 2<8 2<8 2<6 2>1 2<3 2<9
3<4 3>1 3<4 3>2 3<8 3<8 3<6 3>1 3=3 3<9
4>1 4=4 4>2 4<8 4<8 4<6 4>1 4>3 4<9
1<4 1<2 1<8 1<8 1<6 1=1 1<3 1<9
4>2 4<8 4<8 4<6 4>1 4>3 4<9
2<8 2<8 2<6 2>1 2<3 2<9
8=8 8>6 8>1 8>3 8<9
6>1 6>3 6>9
1<3 1<9
3<9mich interessieren nur alle Paare die tatsächlich kleiner sind.
38 sind kleiner
Das Verhältnis wäre hierbei
38/66 , wenn ich mich nicht verzählt habeIch weiß nicht wie ich es genauer beschreiben soll
-
Anfaenger_braucht_Hilfe schrieb:
mich interessieren nur alle Paare die tatsächlich kleiner sind.
38 sind kleiner
Das Verhältnis wäre hierbei
38/66 , wenn ich mich nicht verzählt habeIch weiß nicht wie ich es genauer beschreiben soll
Irgendwo ist da der Wurm drin... 40 sind kleiner, oder?
#include <algorithm> #include <functional> #include <iostream> #include <boost/math/special_functions/binomial.hpp> int main(){ using namespace std; using namespace std::placeholders; using namespace boost::math; int arr[] = { 2, 3, 4, 1, 4, 2, 8, 8, 6, 1, 3, 9, }; int n=0; for(auto first=begin(arr), last=end(arr); first!=last; ++first) n+=count_if(first, last, bind(less<int>(), *first, _1)); const auto pairs = binomial_coefficient<double>(distance(begin(arr), end(arr)), 2); cout << n << " / " << pairs << '\n'; }
Da ist jetzt gar keine Magie in dem Code: ich gucke mir alle Pärchen an und zähle mit.
Mag erstmal komisch aussehen - evtl. wäre ein Lambda sogar lesbarer (bei
count_if()
) - aber es ist zu verstehen, wenn Ducount_if(), bind(), less<T>
in der C++ Dokumentation Deiner wahl nachschaust.C++ ist ja kein Ponyhof.
-
//uber alle startpunkte for(unsigned int x = 0; x != zeilen; x++) { for(unsigned int y = 0; y != spalten; y++) { //ueber alle Paare des Punktes for(unsigned int x1 = x; x1 != zeilen; x1++) { for(unsigned int y1 = y+1; y1 != spalten; y1++) { if(Bild[x][y] < Bild[x1][y1]){ zaehler++; } } } } }