2017-06-15 1 views
1

Ich habe eine Tabelle in Matlab, die Testdaten von verschiedenen Testpersonen enthält. Der Test besteht aus sieben Videoclips mit jeweils vier verschiedenen Audioversionen, die die Testpersonen auf einer Skala von 1 bis 100 bewerten müssen. Jeder Videoclip wird zur statistischen Genauigkeit zweimal dargestellt. Die Testperson drückt die Tasten 1-4 an einer Schnittstelle, um die verschiedenen Audioversionen zu hören.Wie sortiere ich Teile der Tabelle in Matlab?

Meine Tabelle enthält die folgenden Spalten (unter einigen anderen, die nicht relevant für die Frage sind):

Test Person ID  Audio Version  Video Clip Rating 
       1   1   Forest  40 
       1   2   Forest  60 
       1   3   Forest  20 
       1   4   Forest  100 

nun während des Tests, die Audio-Versionen minimale Tendenz zu jeder für eine bestimmte Schaltfläche einführen werden zufällig zwischen jedem Videoclip permutiert. Dies bedeutet, dass die realen Daten wie diese etwas aussehen wird (Audio-Version nicht sortiert):

Test Person ID  Audio Version  Video Clip Rating 
       1   1   Forest  40 
       1   2   Forest  60 
       1   3   Forest  20 
       1   4   Forest  100 
       1   3   City  10 
       1   2   City  50 
       1   1   City  40 
       1   4   City  7 
       1   4   Inside  90 
       1   2   Inside  58 
       1   1   Inside  22 
       1   3   Inside  35 

Was ich tun möchte, ist: die richtige Reihenfolge der Videoclips zu pflegen, so haben nach wie vor Wald -> Stadt -> Innen, aber haben sie alle bestellt, so dass immer Audio ist Version 1, 2, 3, 4:

Test Person ID  Audio Version  Video Clip Rating 
       1   1   Forest  40 
       1   2   Forest  60 
       1   3   Forest  20 
       1   4   Forest  100 
       1   1   City  40 
       1   2   City  50 
       1   3   City  10 
       1   4   City  7 
       1   1   Inside  22 
       1   2   Inside  58 
       1   3   Inside  35 
       1   4   Inside  90 

Mein erster Gedanke war, die sortrow() Funktion in Matlab zu verwenden und diese dann sortiert aufsteigend zusammen mit der Videoclip, aber da die Videoclips zweimal in verschiedenen Phasen des Tests eingeführt werden und ich beibehalten möchte Die gleiche Sequenz der Clips in der Tabelle funktioniert nicht. Auch die gleichen Videoclips werden vielen verschiedenen Testpersonen präsentiert.

Ich verwende eine vorgefertigte Funktion, bei der die Daten auf diese Weise sortiert werden müssen, um statistische Berechnungen durchzuführen. Diese Funktion übernimmt die Matlab-Daten aus einer Struktur und legt sie über eine For-Loop-Zeile für die Zeile in die Tabelle.

Da die Daten über eine for-Schleife in die Tabelle geschrieben werden, dachte ich, es könnte nur eine eine feste Anzahl von Zeilen zu sortieren dh Zeile 1-4, 5-8, 9-12 und so weiter. Wissen Sie, ob es eine Möglichkeit gibt, nur einen Teil einer Tabelle in Matlab zu sortieren?

Antwort

1

Mit reshape und sort können Sie tun:

[~,idx]=sort(reshape(Audio_Version,4,[])); 
idxtble = bsxfun(@plus,idx,0:4:(4*size(idx,2))-1); 
table2 = table1(idxtble,:); 

Erläuterung:

Sie können die Audio-Spalte extrahieren und neu zu gestalten es zu [4 * n] Matrix:

audio = reshape(Audio_Version,4,[]); 

Sortiere dann Audiospalten und erhalte Indizes von sortierten Elementen:

[~,idx]=sort(audio); 

Hier steht idx für die Zeilennummern der sortierten Elemente.

konvertieren idx auf lineare Indizes der gesamten Spalte der Tabelle:

idxtbl = bsxfun(@plus,idx,0:4:(4*size(idx,2))-1); 

Nachbestellung der Tabelle:

table2 = table1(idxtbl,:); 
+0

Vielen Dank für Ihre Antworten. Ich bekomme die erwartete Ausgabe von idx, d. H. Eine Menge von 4 Zeilenspalten, die die Indizes von 1-4 gemäß der Reihenfolge in meiner Tabelle enthalten. Ich verstehe die zweite Zeile jedoch nicht vollständig mit "idxtble". Wenn ich versuche, die Zeile auszuführen, heißt es: "Nicht-Singleton-Dimensionen der beiden Eingabe-Arrays müssen übereinstimmen". Ich entfernte das Inkrement von vier und änderte so die Zeile zu 'idxtble = bsxfun (@plus, idx, 0: 4: Größe (idx, 2) -1); '(was ich denke, war deine ursprüngliche Antwort), aber wenn ich es tue dass ich bei table2 einen einzelnen numerischen Wert habe. – matiastofteby

+0

@matiastoftby Sorry für die späte Antwort. Sie sind richtig.Anfrage aktualisiert. – rahnema1

+0

Vielen Dank! Die aktualisierte Version funktionierte genau so, wie ich es mir erhofft hatte. Ich habe deine Antwort jetzt akzeptiert. Ich wünsche ihnen einen wunderbaren Tag. – matiastofteby

0

mit nur sortrow für den angegebenen Teil der Tabelle wie folgt aus:

table(1:4,:) = sortrow(table(1:4,:), 2); 
table(4:8,:) = sortrow(table(4:8,:), 2); 
table(8:12,:) = sortrow(table(8:12,:), 2); 

Erste Art der Teil der Tabelle, es dann mit dem Teil ersetzen.

2

Sie dies durch die Schaffung eines zusätzlichen numerischen mit einem einzigen Aufruf sortrows tun können Spalte, die Ihr festes Muster von Videopräsentationen darstellt. Diese zusätzliche Spalte kennzeichnet einfach jeden Satz von 4 Zeilen mit einer nachfolgenden Ganzzahl. Es kann concatenated to the beginning of the table sein, dann können Sie durch die erste und dritte Spalten sortieren, die Reihenfolge Sie wollen zu bekommen:

[~, index] = sortrows([table(ceil((1:size(T, 1)).'./4)) T], [1 3]); 
T = T(index, :); 

Und die Ausgabe:

T = 

    ID Audio  Video  Rating 
    __ _____ ________ ______ 

    1  1  'Forest'  40 
    1  2  'Forest'  60 
    1  3  'Forest'  20 
    1  4  'Forest' 100 
    1  1  'City'  40 
    1  2  'City'  50 
    1  3  'City'  10 
    1  4  'City'  7 
    1  1  'Inside'  22 
    1  2  'Inside'  58 
    1  3  'Inside'  35 
    1  4  'Inside'  90 
+0

Vielen Dank für die Antwort - es sieht sicherlich sauber und einfach aus. Ich bin jedoch nicht ganz sicher, ob Sie in diesem Beispiel "T" gegen Tabelle verwenden. Wenn Tabelle ist meine bereits existierende Tabelle dann wo/wie deklariere ich T? – matiastofteby

+1

@matiastoftby: 'T' ist Ihre vorhandene Tabelle. Ersetzen Sie es einfach durch die Variable, die Ihren Tisch speichert. – gnovice