WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Gruppen einer Matrix nach Spalte sortieren

 

agent_fux
Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 12.01.17
Wohnort: ---
Version: MATLAB R2016b student use
     Beitrag Verfasst am: 12.02.2017, 15:49     Titel: Gruppen einer Matrix nach Spalte sortieren
  Antworten mit Zitat      
Hallo,

ich habe eine Matrix der Dimension 62393x45, in der ich Daten verschiedenen Gruppen zugeordnet habe. Jetzt möchte ich die Gruppen absteigend nach den Werten einer anderen Spalte sortieren, sodass aber die Gruppe als ganzes erhalten bleibt.

Beispiel wie es aussehen soll:
    Spalte mit Gruppennummer:2 2 2 2 2 1 1 3 3 3 5 5 4 4 4 4 4 4 4 4 4 4

    Spalte mit Wert:0.9 0.29 0.8 0.4 0.66 0.83 0.9 0.1 0.3 0.21 0.29 0.8 0.4 0.66 0.83 0.1 0.3 0.21 0.33


Wie kann ich das realisieren?
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.02.2017, 20:53     Titel:
  Antworten mit Zitat      
Hallo,

ich bin mir nicht sicher, ob ich die Art der Sortierung richtig verstehe, aber tippe mal auf
sortrows

Ein Beispiel ist dann besonders hilfreich, wenn es gegebene Daten und gewünschtes Ergebnis beinhaltet.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
agent_fux
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 12.01.17
Wohnort: ---
Version: MATLAB R2016b student use
     Beitrag Verfasst am: 13.02.2017, 11:28     Titel:
  Antworten mit Zitat      
Ok, ich habe hier eine Tabelle mit den Daten und deren Struktur. In Spalte 4 befindet sich die Bezeichnung der Gruppe (Segment). Dieses Spalte soll jetzt nach Spalte 21 absteigend sortiert werden, aber die Gruppen sollen "zusammenbleiben". Wenn ich sortrows anwende, dann stehen die Zeilen einer Gruppe nicht mehr zusammen, sondern getrennt.

Aktuell sieht Spalte 4 unsortiert so aus: 0000 1 222 33333 usw.
Nach der Sortierung soll das z.B. so aussehen: 33333 0000 222 1.
Wenn ich sortrows verwende, sieht Spalte 4 so aus: 3 2 1 0 1 2 3 usw. Und das möchte ich nicht.

Fahrdaten.pdf
 Beschreibung:

Download
 Dateiname:  Fahrdaten.pdf
 Dateigröße:  38.19 KB
 Heruntergeladen:  373 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.02.2017, 11:49     Titel:
  Antworten mit Zitat      
Hallo,

wie sollen denn die Gruppen sortiert werden? Du hast ja in Spalte 21 für viele Gruppen nicht einen, sondern mehrere Werte. Soll zur Sortierung der Mittelwert genommen werden, oder wie...

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
agent_fux
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 12.01.17
Wohnort: ---
Version: MATLAB R2016b student use
     Beitrag Verfasst am: 13.02.2017, 12:07     Titel:
  Antworten mit Zitat      
Es soll nach dem maximalen Wert jeder Gruppe sortiert werden.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.02.2017, 12:18     Titel:
  Antworten mit Zitat      
Hallo,

hier ein Vorschlag:
Code:
group = [2 2 2 2 2 1 1 3 3 3 5 5 4 4 4 4 4 4 4]';
data = [0.9 0.29 0.8 0.4 0.66 0.83 0.92 0.1 0.3 0.21 0.29 0.8 0.4 0.66 0.83 0.1 0.3 0.21 0.33]';
combined = [group, data];

[group, gn] = findgroups(group);
maxis = splitapply(@max, data, group);

[sMaxis, idx] = sort(maxis, 'descend');

newdata = zeros(0,2);
for I = 1:numel(idx)
    currentGroup = gn(idx(I));
    newdata = [newdata; combined(group == currentGroup, :)];
end


Hier wird noch nicht innerhalb einer Gruppe sortiert. Wenn du das möchtest, müsstest du den Code noch entsprechend anpassen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
agent_fux
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 12.01.17
Wohnort: ---
Version: MATLAB R2016b student use
     Beitrag Verfasst am: 13.02.2017, 19:43     Titel:
  Antworten mit Zitat      
Der Vorschlag geht schon in die richtige Richtung, aber:

1. Es fehlen in newdata etliche Zeilen. Meine Matrix hat ca. 65.000 Zeilen und danach sind es nur noch ca. 39.000.

2. Diese Sortierung soll innerhalb der Matrix mit 45 Spalten durchgeführt werden.

Am Ende soll die Matrix 65.000 x 45 sortiert sein.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.02.2017, 23:41     Titel:
  Antworten mit Zitat      
Hallo,

zu 1.: in deinem im ersten Beitrag gegebenen Beispiel werden alle Zeilen erfasst. Wenn das für deine tatsächliche Daten nicht der Fall ist, unterscheiden sich diese Daten in irgendeiner Form vom Beispiel. Wie, kann ich ohne ein entsprechendes Beispiel nicht sagen.

zu 2.: wenn du das richtig überträgst, sollte genau das der Fall sein. combined wäre die gesamte Matrix, group die Gruppierungsspalte und data die Spalte, nach der sortiert werden soll.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
agent_fux
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 12.01.17
Wohnort: ---
Version: MATLAB R2016b student use
     Beitrag Verfasst am: 14.02.2017, 11:32     Titel:
  Antworten mit Zitat      
Wenn ich Deinen Code mit meinen Beispieldaten anwende, dann klappt es. Nur wenn ich den Code auf die richtigen Daten anwende, dann nicht so richtig. Deswegen ist im Anhang die Datei mit den originalen Daten. Spalte D sind die Gruppen und Spalte U die Werte, nach denen die Gruppen absteigend sortiert werden sollen.

Stadt1.xls
 Beschreibung:

Download
 Dateiname:  Stadt1.xls
 Dateigröße:  39.37 MB
 Heruntergeladen:  502 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 14.02.2017, 14:00     Titel:
  Antworten mit Zitat      
Hallo,

und wie sieht der Code aus, den du momentan mit Stadt1.xls verwendest?
Klar kann ich das selber umschreiben, aber du hast das ja sicher schon gemacht.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
agent_fux
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 12.01.17
Wohnort: ---
Version: MATLAB R2016b student use
     Beitrag Verfasst am: 14.02.2017, 14:34     Titel:
  Antworten mit Zitat      
Code:
group = Stadt1(:,4);
data = Stadt1(:,21);
combined = [group, data];

[group, gn] = findgroups(group);
maxis = splitapply(@max, data, group);

[sMaxis, idx] = sort(maxis, 'descend');

newdata = zeros(0,2);
for I = 1:numel(idx)
    currentGroup = gn(idx(I));
    newdata = [newdata; combined(group == currentGroup, :)];
end
 


Ich habe noch nicht viel geändert, weil ich es erstmal probieren wollte.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 14.02.2017, 14:47     Titel:
  Antworten mit Zitat      
Hallo,

wenn du am Ende alle Daten haben möchtest, muss combined auch alles beinhalten.
Code:
combined = Stadt1; % oder direkt einen Namen für die Variable verwenden.

Fehler bei mir:
- Variable überschrieben, die ich noch brauchte
- leeres Array mit 2 Spalten statt variabel vorbelegt

Code:
[newgroup, gn] = findgroups(group);
maxis = splitapply(@max, data, newgroup);

[sMaxis, idx] = sort(maxis, 'descend');

newdata = zeros(0,size(combined,2));
for I = 1:numel(idx)
    currentGroup = gn(idx(I));
    newdata = [newdata; combined(group == currentGroup, :)];
end


Hinsichtlich Performance mag es noch bessere Lösungen statt der for-Schleife geben.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
agent_fux
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 12.01.17
Wohnort: ---
Version: MATLAB R2016b student use
     Beitrag Verfasst am: 15.02.2017, 12:46     Titel:
  Antworten mit Zitat      
Super! Es klappt. Recht HERZLICHEN Dank! Very Happy
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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.