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

Matrixzeilen anhand eines Arrays sortieren

 

thinkpad-fan
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 31.01.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.03.2013, 14:43     Titel: Matrixzeilen anhand eines Arrays sortieren
  Antworten mit Zitat      
Hallihallo,

ich möchte mit Matlab verschiedene MEG-Datensätze analysieren und habe aktuell das Problem, dass die Sensoren nicht in einer logischen Reihenfolge sortiert sind und möchte diese somit sortieren.

Dazu habe ich ein Cell-array welches folgendermaßen aufgebaut ist:
data.label <389x1 cell>
data.trial <389x20 cell>

In der Trial-Zelle sind nur Zahlen gespeichert und im label eben die Bezeichnung: MEG0111, MEG0113, MEG0112,MEG0121, MEG0122, MEG0123 usw.

Die Labels mit der Endung 1 sind in dreierschritten sortiert, was somit in der for-schleife kein Problem darstellt (Schrittweite einfach 3 setzen).
Für die Endung mit zwei bzw. drei ist dies jedoch nicht so leicht, da hier die Schrittweite mal zwei und mal vier ist.

Meine Überlegung ist nun, die beiden Zellen zu verbinden (damit auch die Zeilen aus data.trial mit sortiert werden) und dann nach dem Muster


    MEG0111
    MEG0112
    MEG0113
    MEG0121
    MEG0122
    MEG0123
    MEG0131

oder
    MEG0111
    MEG0121
    MEG0131
    MEG0141
    ...
    MEG0122
    MEG0132
    MEG0142...

zu sortieren, damit ich die for-schleife einfach gestalten kann.

Bisher habe ich versucht

  • die beiden Cell-Arrays in eine Matrix zu formen (klappt nicht, weil Strings und Integers wohl nicht in eine Matrix 'passen')
  • die beiden cell-Arrays zu verbinden und dann zu sortieren (klappt nicht, weil alle labels in eine Zeile gelangen oder die non-integerwerte weggelassen werden und somit die Dimensonen nicht mehr stimmen.)



Habt ihr eine Idee, wie ich mein Vorhaben umsetzen kann oder ist es noch nicht klar geworden?

Beste Grüße
C
Private Nachricht senden Benutzer-Profile anzeigen


denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 25.03.2013, 15:18     Titel:
  Antworten mit Zitat      
Hallo

also aus deiner Problembeschreibung werde ich nicht schlau? Kannst du anhand eines Beispiels das verdeutlichen:

zusammenfassen von Cells sollte keine Probleme bereiten und sortieren doch auch:
Code:

 data.label ={'MEG0111'; 'MEG0112';'MEG0113';'MEG0122';'MEG0122';'MEG0123';'MEG0131'; 'MEG0121'}
data.trial   = num2cell(meshgrid(1:8,1:20)')
C = [data.label data.trial]
sortrows(C,1)
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

du kannst dir von SORT zwei Rückgabeargumente zurückgeben lassen und das dann als Sortierreihenfolge auf eine andere Variable anwenden.

Hier werden x-Werte nach y-Werten sortiert:

Code:
[sorty, idx] = sort(y);
sortx = x(idx);


Bei deinem Problem ist mir allerdings noch nicht klar, warum du überhaupt irgendwas sortieren willst.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 25.03.2013, 15:46     Titel: Re: Matrixzeilen anhand eines Arrays sortieren
  Antworten mit Zitat      
Hallo thinkpad-fan,

Zitat:
Dazu habe ich ein Cell-array welches folgendermaßen aufgebaut ist:
data.label <389x1 cell>
data.trial <389x20 cell>

Das sieht nicht wie ein Cell-Array aus, sondern wie ein skalarer Struct, der zwei Felder enthält, die wiederung Cell-Arrays enthalten. Bei einer Diskussion über eine Programmier-Sprache sind präzise Ausdrücke hilfreich, denn Matlab selbst nimmt solche Details ebenfalls sehr genau.

Zitat:
Die Labels mit der Endung 1 sind in dreierschritten sortiert, was somit in der for-schleife kein Problem darstellt (Schrittweite einfach 3 setzen).
Für die Endung mit zwei bzw. drei ist dies jedoch nicht so leicht, da hier die Schrittweite mal zwei und mal vier ist.

Meine Überlegung ist nun, die beiden Zellen zu verbinden (damit auch die Zeilen aus data.trial mit sortiert werden) und dann nach dem Muster

Das verstehe ich nicht. Was bedeutet "in dreierschritten sortiert"? Von welcher FOR-Schleife sprichst Du? Was genau ist die "Schrittweite"?

Zitat:
klappt nicht, weil Strings und Integers wohl nicht in eine Matrix 'passen')

Bitte poste den Code und die Fehlermeldung. Auf "klappt nicht" kann man keinen vernünftigen Verbesserungsvorschlag geben.

Ich empfehle, das Problem nochmal zu beschreiben:
1. Die vorhandenen Inputs in valider Matlabsyntax, also am besten so, dass man per Copy&Paste lauffähigen Code bekommt. Dann ist es am einfachsten, etwas damit herum zu spielen.
2. Wie genau sollen die Werte sortiert werden?
3. Wie sieht für ein kleines relevantes Beispiel das Ergebnis aus?

Wäre es eventuell ausreichend, die label's alphabetisch zu sortieren? Wenn nicht, weshalb nicht?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
thinkpad-fan
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 31.01.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.03.2013, 17:01     Titel:
  Antworten mit Zitat      
Vielen Dank für Hinweise.

Ich habe schon befürchtet, dass ich mich nicht klar genug ausgedrückt habe. Sad

Ich habe hier einen Datensatz, der Messergebnisse von Gehirnströmen etc hat. Ein Teil der Sensoren sind einfache Skalare (die EEG-Datensätze, hier klappt ja auch alles super) der andere Teil besteht aus 3D-koordinaten (xyz; die MEG-Datensätze)

Das Problem ist nun, dass die Reihenfolge der Koordinaten nicht immer xyzxyzxyz... ist sondern unregelmäßig 'verteilt' sind.

Die oben genannte Schrittweite soll bewirken, dass ich beispielsweise die x-Koordinate des ersten mit der x-Koordinate des zweiten Sensors vergleiche usw.

Ich habe mir die einzelnen Labels einmal genauer angesehen und habe folgedes herausgefunden:
Code:
data.label{[color=darkred]x[/color],1}<1x7 char>

Die Zahl x geht von 1 bis 389.

Code:
data.trial{1,[color=orange]y[/color]}<389x5000 double>
Y geht von 1 bis 20.

Versuche ich jetzt
Code:
c= [data.label data.trial]
erhalte ich folgende Fehlermeldung:
Zitat:
C = [data.label data.trial];
??? Error using ==> horzcat
CAT arguments dimensions are not consistent.

>> C = [data.label trial'];
??? Error using ==> horzcat
CAT arguments dimensions are not consistent.


Wenn ich beispielsweise die trials folgendermaßen zusammenfasse erscheint der gleiche fehler:
Code:
a= horzcat(data.trial{:});
a= a';
Zitat:
C = [data.label a];
??? Error using ==> horzcat
CAT arguments dimensions are not consistent.

C = [data.label a'];
??? Error using ==> horzcat
CAT arguments dimensions are not consistent.


Gerne würde ich euch meinen kompletten code geben aber er funktioniert nicht ohne die einzulesende Datei und eine Formelsammlung (fieldtrip) um diese Datei einzulesen.

@Denny:
genau so habe ich es zu anfang an probiert aber erhielt jedoch immer oben genannten Fehler, womit ich noch nicht viel anfangen konnte, da ich davon ausgehe, dass ich eine 389-Zeilenmatrix an eine 389-Zeilenmatrix anhänge. Oder mache ich dies mit dem oben genannten Befehl gar nicht?

@Jan:
Ich versuche die begriffe in Zukunft genauer zu differenzieren. Bzgl. Script etc.: s.o..


Beste Grüße
TPF
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 25.03.2013, 18:57     Titel:
  Antworten mit Zitat      
Hallo thinkpad-fan,

Zitat:
Code:
data.label{[color=darkred]x[/color],1}<1x7 char>

Die Zahl x geht von 1 bis 389.

Zu raten, was dies bedeuten soll, ist ineffizient. Ich wiederhole mich nochmal:
Bitte poste die vorhandenen Inputs in valider Matlab-Syntax, so dass man sie per Copy&Paste verwenden kann. Beispiel:
Code:
data.label = {'Hallo', 'wach'};

Wie soll dann, wieder in valider Matlab-Syntax, das gewünschte Endergebnis aussehen?

Ich vermute, das Problem ist sehr leicht zu lösen, wenn es erstmal konkret niedergeschrieben wurde.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
thinkpad-fan
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 31.01.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.03.2013, 21:16     Titel:
  Antworten mit Zitat      
Hallo Jan,

ich habe gerade gesehen, dass innerhalb einer Code-umgebung kein BB-Code umgesetzt wird, daher sieht mein Code komisch aus.

Das Ding hat die Form
Code:
data.label{1,1}<1x7 char>

und sieht dann – wenn ich es recht erinnere (Ich habe das Script nur auf dem Unirechner und kann erst nächste Woche wieder ran) – so aus:
Zitat:

data.label{1,1}[sensor1_x]
data.label{2,1}[sensor1_y]
data.label{3,1}[sensor1_z]
data.label{4,1}[sensor2_x]
data.label{5,1}[sensor2_z]
data.label{6,1}[sensor2_y]
data.label{7,1}[sensor3_x]
...

Alternativ kann es auch
Zitat:

data.label{1,1}{sensor1_x}
data.label{2,1}{sensor1_y}
data.label{3,1}{sensor1_z}
data.label{4,1}{sensor2_x}
data.label{5,1}{sensor2_z}
data.label{6,1}{sensor2_y}
data.label{7,1}{sensor3_x}
...
sein.

Ich glaube das einfachte wird es sein die Variable als .mat zu exportieren und hier dann hochzuladen. Dann werde ich auch den Aufbau der Datei genauer erläutern können.
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 26.03.2013, 11:23     Titel:
  Antworten mit Zitat      
Hallo thinkpad-fan,

"Copy&Paste" bedeutet, dass man den entsprechenden Text mit der Maus markiert, auf "Copy" drückt (Kontext-Menü, Fenster-Menü oder Strg-C), dann aktiviert man das Matlab-Fenster (z.B. rein-klicken oder Alt-Tab) und drückt wieder Paste (Kontext-Menü, Fenster-Menü oder Strg-V).

Wenn man dies mit "data.label{1,1}<1x7 char>" macht, kann Matlab mit dem Ausdruck "<1x7>" nicht anfangen, weil dies bedeutet:
"Kleiner als, "1x7" is ein ungültiger Variablen- oder Funktionsname, größer als."
Ähnliches gilt für: "data.label{1,1}[sensor1_x]": Die eckigen Klammern erzeugen einen Vektor aus einer Komma/Semicoln-separierten Liste. Da nur ein Skalar darin steht, wird also ein Vektor zurückgegeben. Aber einen Vektor direkt hinter ein Element eines Cell-Arrays zu schreiben, erzeugt in Matlab einen Fehler.

Ich habe also immer noch keine Ahnung, wie die Input-Daten aussehen und ob "[data, index] = sort(value)" nicht bereits alles erzeugt, was Du brauchst. Das wiederholte Nachbohren ist nicht effizient und eine sorgfältige Beantwortung der Rückfragen wäre eine wirklich gute Idee, wenn man Hilfe in einem Forum bekommen möchte. Ich erinnere Dich an:
Zitat:
Bitte poste den Code und die Fehlermeldung. Auf "klappt nicht" kann man keinen vernünftigen Verbesserungsvorschlag geben.


Was bedeutet "Alternativ kann es auch ... sein"? Wir können nicht entsc heiden, welche Alternative zu Deinem Programm passt, Du aber wohl schon.

Das Uploaden eines MAT-Files wäre eine Alternative, ich zumindest könnte das aber nicht lesen, da ich kein Matlab zur Verfügung habe.
Den Aufbau welcher "Datei" möchtest Du genauer erläutern?

Gruß, Jan

PS. Ich setze den Status auf "komplex", weil es sehr schwierig ist, beim Lesen des Themas herauszubekommen, was Du aus welchen Daten erzeugen möchtest.
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 26.03.2013, 11:27     Titel:
  Antworten mit Zitat      
Hallo

Zitat:
Ich habe mir die einzelnen Labels einmal genauer angesehen und habe folgedes herausgefunden:

data.label{x,1}<1x7 char>

Die Zahl x geht von 1 bis 389.


data.trial{1,y}<389x5000 double>

Y geht von 1 bis 20.


Ach so, TRIAL-Cell hat nur 20 Elemente? (Das sind wohl deine Experimente)
Und in jedem Cell ist eine Matrix mit Messungen der Größe <389x5000 double> versteckt?

Dann kannst natürlich keine Matrix mit Cell-Matrix zusammensetzen, beides muss von gleichen Typ und Größe sein.

Jetzt natürlich muss du beschreiben, wie du verfahren möchtest:
soll jede Matrix in Cell sortiert werden ???, willst du die Experimente zusammensetzen.

Vielleicht ist besser den Harald's Vorschlag zu verwenden, Labels zuerst zu sortieren und dann die Sortierung-Indizes auf einzelne Experimente anwenden:
Code:

[sorty, idx] = sort(data.label);
for y=1:length(data.trial)
  data.trial{1,y} = data.trial{1,y}(idx,:);
end
 



wenn du die Labels und Trials zusammensetzen möchtest, dann musst du deine Matrix zu Cell konvertieren
Code:


trial= num2cell(horzcat(data.trial{:}));
[data.label,trial]

 
Private Nachricht senden Benutzer-Profile anzeigen
 
thinkpad-fan
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 31.01.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.04.2013, 15:48     Titel: long time no see...
  Antworten mit Zitat      
...aber doch wieder dabei Very Happy

Ich habe die Lösung gefunden und dabei folgendes gelernt:
[*] Matrizen mit Strings und Zahlen lassen sich nicht vereinigen.

Meine Lösung sieht nun wie folgt aus:
Code:
clear all; clc;
% laden der Daten
load('C:\Dokumente und Einstellungen\student1\Desktop\data.mat');
% Erstellen zweier cells
values=num2cell(horzcat(data.trial{:}));
labels=data.label;
% Kombinieren der beiden cells
kombinierte_matrix = [labels values];
% Sortieren
kombinierte_matrix_sorted= sortrows(kombinierte_matrix);
% Labelspalte löschen
kombinierte_matrix_sorted(:,1) = [];
% cell-array in matric umwandeln
kombinierte_matrix_sorted_normal = cell2mat(kombinierte_matrix_sorted);


Ich warte ab, wie es sich mit Matrizen höherer Dimension 389x400.000 verhält, aktuell kann ich dies an meinem PC in Ermangelung von genügend Arbeitsspeicher nicht testen.
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 - 2025 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.