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 1

    Verglichen soll so
    3 < 5
    3 => 2
    3 => 1
    5 => 2
    5 => 1
    2 < 1

    danach 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
                                    }
                                }
    
                            }
    

  • Mod

    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 9

    Vergleich
    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<9

    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 habe 😕

    Ich 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 habe 😕

    Ich 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 Du count_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++;
                    }
                }
            }
        }
    }
    

Log in to reply