Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   
Bücher:

Studierende:
weitere Angebote

Partner:


Vermarktungspartner


Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Gleiche Werte finden und entsp. Werte mitteln

 

Denni

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.09.2019, 11:45     Titel: Gleiche Werte finden und entsp. Werte mitteln
  Antworten mit Zitat      
Hallo liebes Forum,

ich habe eine A=2x197 Matrix.

Ich würde gerne für alle Werte der ersten Zeile, die gleich sind, die korrespondierenden Werte der zweiten Zeile mitteln und daraus eine neue Matrix erstellen.

Also zB:
A = [ 1 1 1 2 3 3 4
2 4 3 2 4 4 2]

wird zu

B= [ 1 2 3 4
3 2 4 3]

Danke alle zusammen und VG, Denni


ueg
Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 15.08.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.09.2019, 13:18     Titel:
  Antworten mit Zitat      
Damit müsste das funktionieren.
Der Code ist allerdings nur eben hingeschrieben. Man kann das garantiert noch deutlich eleganter machen.

An einer Random 2x200 Matrix hat der Code zumindest funktioniert.
Edit: Das funktioniert allerdings nur wenn die Zahlen in der ersten Zeile von A aufsteigend sortiert sind. Falls das nicht der Fall ist, musst du vorher A noch entsprechend sortieren lassen.

Code:
%A = %hier eingelesene Matrix einfügen

laengeA = length(A);
Ausleseposition=1;


while Ausleseposition ~= laengeA+1

    Summe = A(2,Ausleseposition);
    Zaehler = 1;
    if Ausleseposition == laengeA
        AusgeleseneZahlersteZeile = A(1,Ausleseposition);
        B(1,AusgeleseneZahlersteZeile) = AusgeleseneZahlersteZeile;
        B(2, AusgeleseneZahlersteZeile) = A(2,Ausleseposition);
        break
    end
       
    while A(1,Ausleseposition)==A(1,Ausleseposition+1)
        Ausleseposition = Ausleseposition+1;

        Zaehler = Zaehler +1;
        Summe = Summe + A(2, Ausleseposition);
        if Ausleseposition == laengeA
           break
        end
    end
    AusgeleseneZahlersteZeile = A(1,Ausleseposition);
    B(1,AusgeleseneZahlersteZeile) = AusgeleseneZahlersteZeile;
    B(2, AusgeleseneZahlersteZeile) = Summe/Zaehler;
    if Ausleseposition == laengeA
       break
    end
   
    Ausleseposition = Ausleseposition+1;
end

% B ist die sortierte und gemittelte Matrix
Private Nachricht senden Benutzer-Profile anzeigen
 
Denni

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.09.2019, 13:55     Titel:
  Antworten mit Zitat      
Hey, vielen Dank!

Ich bekomme folgende Fehlermeldung:

Attempted to access (1,0.499996); index must be a positive integer or logical

Leider auch ohne Zeilenangabe.
Ich nehme an, einer der Zähler hat also keine ganze Zahl ergeben. Jedoch habe ich eine grade Zahl gewählt. Hast du eventuell eine Idee wo dieser Bug liegen könnte?
(Zahlen der ersten Reihe sind aufstigend sortiert!)


Herzliche Grüße!
 
ueg
Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 15.08.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.09.2019, 16:28     Titel:
  Antworten mit Zitat      
In der ersten Zeile von A stehen nur ganze Zahlen oder?
Für Kommazahlen in der ersten Zeile habe ich mir keine Lösung überlegt. Very Happy
In der zweiten Zeile müsste es eigentlich egal sein was drin steht.

Bei Random 2x200 Matrizen bei denen in A(1,: ) nur ganze Zahlen stehen, funktioniert das bei mir eigentlich..
Wenn du mir deine Matrix mal hochladen könntest, kann ich eben schauen ob ich die selbe Fehlermeldung bekomme.

VG Tim
Private Nachricht senden Benutzer-Profile anzeigen
 
Denni

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.09.2019, 18:01     Titel:
  Antworten mit Zitat      
Alles klar, das erklärt die Fehlermeldung! In meiner Matrize stehen in beiden Zeilen Komma Zahlen. Very Happy

Im Anhang die Matrix und danke dir nochmal!

Variable.mat
 Beschreibung:

Download
 Dateiname:  Variable.mat
 Dateigröße:  2.05 KB
 Heruntergeladen:  50 mal
 
ueg
Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 15.08.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.09.2019, 17:22     Titel:
  Antworten mit Zitat      
Ich schaue nachher mal ob ich meinen Code nicht anpassen kann. An sich dürfte das kein großes Ding sein. Wink

Klar ich habe die Zahlen die man in der ersten Zeile in A ausgelesen hat als Spalte in B genommen da ich dachte, es seien nur ganze Zahlen in A.

So funktioniert es denke ich.
Prüfe es aber am besten nochmal von Hand an ein paar Beispielen.. Very Happy

Code:
%Sortiert alle identischen Einträge in der ersten Zeile von A zusammen und
%mittelt die zweite Zeile von A für die selben A1.



A=sorted_EAI_short;



laengeA = length(A);
Ausleseposition=1;
PositionB=1;

while Ausleseposition ~= laengeA+1

    Summe = A(2,Ausleseposition);
    Zaehler = 1;
    if Ausleseposition == laengeA
        AusgeleseneZahlersteZeile = A(1,Ausleseposition);
        B(1,PositionB) = AusgeleseneZahlersteZeile;
        B(2, PositionB) = A(2,Ausleseposition);
        break
    end
        Vergleich1 = A(1, Ausleseposition);
        Vergleich2 = A(1, Ausleseposition+1);
    while Vergleich1==A(1,Ausleseposition+1)
        Vergleich1 = Vergleich2;
        Vergleich2=Vergleich2+1;
        Ausleseposition=Ausleseposition+1;

        Zaehler = Zaehler +1;
        Summe = Summe + A(2, Ausleseposition);
        if Ausleseposition == laengeA
           break
        end
    end
    AusgeleseneZahlersteZeile = A(1,Ausleseposition);
    B(1,PositionB) = AusgeleseneZahlersteZeile;
    B(2, PositionB) = Summe/Zaehler;
    PositionB=PositionB+1;
    if Ausleseposition == laengeA
       break
    end
   
    Ausleseposition = Ausleseposition+1;
end

% B ist die sortierte und gemittelte Matrix    
   
   
Private Nachricht senden Benutzer-Profile anzeigen
 
ueg
Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 15.08.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.09.2019, 18:35     Titel:
  Antworten mit Zitat      
Code:
A=sorted_EAI_short;

laengeA = length(A);
Ausleseposition=1;
PositionB=1;

while Ausleseposition ~= laengeA+1

    Summe = A(2,Ausleseposition);
    Zaehler = 1;
    if Ausleseposition == laengeA
        AusgeleseneZahlersteZeile = A(1,Ausleseposition);
        B(1,PositionB) = AusgeleseneZahlersteZeile;
        B(2, PositionB) = A(2,Ausleseposition);
        break
    end

    while A(1,Ausleseposition)==A(1,Ausleseposition+1)
        Ausleseposition=Ausleseposition+1;

        Zaehler = Zaehler +1;
        Summe = Summe + A(2, Ausleseposition);
        if Ausleseposition == laengeA
           break
        end
    end
    AusgeleseneZahlersteZeile = A(1,Ausleseposition);
    B(1,PositionB) = AusgeleseneZahlersteZeile;
    B(2, PositionB) = Summe/Zaehler;
    PositionB=PositionB+1;
    if Ausleseposition == laengeA
       break
    end
   
    Ausleseposition = Ausleseposition+1;
end

% B ist die sortierte und gemittelte Matrix    


Ich habe mir das mit den Vergleichen noch einmal angeschaut.
So müsste das etwas besser passen. An sich müsste es aber auch in der vorherigen Version funktioniert haben...
Wie gesagt: aber besser nochmal selbst überprüfen. Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
Denni

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.09.2019, 18:39     Titel:
  Antworten mit Zitat      
Perfekt!! Tausend Dank!! Smile
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 20.930
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 22.09.2019, 19:37     Titel:
  Antworten mit Zitat      
Hallo,

mit findgroups / splitapply geht das deutlich einfacher:

Code:
[gp, id] = findgroups(A(1,:));
m = splitapply(@mean, A(2,:), gp)
result = [id; m]


Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
ueg
Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 15.08.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.09.2019, 19:50     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:
Hallo,

mit findgroups / splitapply geht das deutlich einfacher:

Code:
[gp, id] = findgroups(A(1,:));
m = splitapply(@mean, A(2,:), gp)
result = [id; m]


Grüße,
Harald


So macht man das dann wahrscheinlich wenn man sich mit Matlab auskennt. Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.


goMatlab ist ein Teil des goForen-Labels
goForen.de goMATLAB.de goLaTeX.de


 Impressum  | Nutzungsbedingungen  | Datenschutz  | Werbung/Mediadaten | Studentenversion | FAQ | goMatlab RSS Button RSS


Copyright © 2007 - 2020 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
Partner: LabVIEWforum.de

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.