|
|
|
Matrixzeilen anhand eines Arrays sortieren |
|
| thinkpad-fan |

Forum-Newbie
|
 |
Beiträge: 5
|
 |
|
 |
Anmeldedatum: 31.01.13
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 25.03.2013, 14:43
Titel: Matrixzeilen anhand eines Arrays sortieren
|
 |
| |
 |
|
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
|
|
|
|
|
|
| denny |

Supporter
|
 |
Beiträge: 3.853
|
 |
|
 |
Anmeldedatum: 14.02.08
|
 |
|
 |
Wohnort: Ulm
|
 |
|
 |
Version: R2012b
|
 |
|
|
 |
|
Verfasst am: 25.03.2013, 15:18
Titel:
|
 |
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:
|
|
|
|
| Harald |

Forum-Meister
|
 |
Beiträge: 24.502
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 25.03.2013, 15:18
Titel:
|
 |
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:
Bei deinem Problem ist mir allerdings noch nicht klar, warum du überhaupt irgendwas sortieren willst.
Grüße,
Harald
|
|
|
|
| Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 25.03.2013, 15:46
Titel: Re: Matrixzeilen anhand eines Arrays sortieren
|
 |
| |
 |
|
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
|
|
|
|
| thinkpad-fan |
Themenstarter

Forum-Newbie
|
 |
Beiträge: 5
|
 |
|
 |
Anmeldedatum: 31.01.13
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 25.03.2013, 17:01
Titel:
|
 |
| |
 |
|
Vielen Dank für Hinweise.
Ich habe schon befürchtet, dass ich mich nicht klar genug ausgedrückt habe.
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:
Die Zahl x geht von 1 bis 389.
Y geht von 1 bis 20.
Versuche ich jetzt
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:
| 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
|
|
|
|
| Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 25.03.2013, 18:57
Titel:
|
 |
Hallo thinkpad-fan,
| Zitat: |
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:
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
|
|
|
|
| thinkpad-fan |
Themenstarter

Forum-Newbie
|
 |
Beiträge: 5
|
 |
|
 |
Anmeldedatum: 31.01.13
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 25.03.2013, 21:16
Titel:
|
 |
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
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.
|
|
|
|
| Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 26.03.2013, 11:23
Titel:
|
 |
| |
 |
|
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.
|
|
|
|
| denny |

Supporter
|
 |
Beiträge: 3.853
|
 |
|
 |
Anmeldedatum: 14.02.08
|
 |
|
 |
Wohnort: Ulm
|
 |
|
 |
Version: R2012b
|
 |
|
|
 |
|
Verfasst am: 26.03.2013, 11:27
Titel:
|
 |
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:
wenn du die Labels und Trials zusammensetzen möchtest, dann musst du deine Matrix zu Cell konvertieren
|
|
|
|
| thinkpad-fan |
Themenstarter

Forum-Newbie
|
 |
Beiträge: 5
|
 |
|
 |
Anmeldedatum: 31.01.13
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 12.04.2013, 15:48
Titel: long time no see...
|
 |
...aber doch wieder dabei
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:
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.
|
|
|
|
|
|
|
Einstellungen und Berechtigungen
|
|
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
| 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.
|
|