2013-04-08 13 views
5

Mam 108x8 Matrix (zwaną macierz), który wygląda tak:Jak zmienić kolejność kolumn macierzy komórek na podstawie kolejności macierzy wektorowej, zachowując wiersze nienaruszone w programie Matlab?

5 8 3 6 2 1 7 4 
8 4 2 7 1 3 6 5 
5 4 3 2 1 7 8 6 
1 7 8 5 6 4 3 2 

mam kolejną tablicę 108x8 komórek (tzw danych), który wygląda tak:

'B' 'B' 'B' 'A' 'B' 'B' 'A' 'B' 
    'A' 'B' 'B' 'A' 'B' 'A' 'A' 'A' 
    'A' 'A' 'B' 'A' 'A' 'B' 'B' 'B' 
    'A' 'A' 'A' 'B' 'A' 'A' 'A' 'A' 

Chcę przegrupowania macierz w taki sposób, że każdy rząd pozostaje nienaruszony i jest posortowany w porządku rosnącym. Można to łatwo zrobić za pomocą polecenia [vals order] = sort(matrix,2). Chcę zmienić układ macierzy danych w ten sam sposób.

Dotychczasowe rozwiązania zasugerował użycie polecenia takie jak:

reordered_data=data(order) 

to jednak nie daje pożądanego rezultatu, to jednak zmienić dane, ale nie we właściwej kolejności.

Mam nadzieję, że jest to jasne, proszę dać mi znać, jeśli potrzebne jest wyjaśnienie.

Dziękuję.

Odpowiedz

0

Czy próbowałeś używać sortrows?

[vals, I] = sortrows(matrix); 
for i = 1:size(matrix,1); 
    reordered_data(i,:) = data(I(i),:); 
end 

Jest to wynikiem:

reordered_data = 

    'A' 'A' 'A' 'B' 'A' 'A' 'A' 'A' 
    'A' 'A' 'B' 'A' 'A' 'B' 'B' 'B' 
    'B' 'B' 'B' 'A' 'B' 'B' 'A' 'B' 
    'A' 'B' 'B' 'A' 'B' 'A' 'A' 'A' 
+1

Dziękujemy! Jednak, że daje w wyniku: 'reordered_data = 'B' \t 'B' \t 'A' \t 'B' \t 'A' \t 'A' \t 'B' \t 'B' 'B' \t ' B”\t 'B' \t 'B' \t 'B' \t 'B' \t 'B' \t 'B' 'A' \t 'A' \t 'A' \t 'A' \t 'A' \t 'A' \t 'A' \t 'A' 'B' \t 'B' \t 'A' \t 'B' \t 'B' \t 'B' \t 'B' \t 'B''' – user2258821

+0

Mój zły, zobacz edycję, to powinno zachować nienaruszone wiersze. – Junuxx

+0

Dzięki, ale to wciąż nie jest poprawne. Pierwszy wiersz 'reordered_data' powinien mieć tylko dwie wartości" A ". – user2258821

1

Można konwertować order indeks matrix indeksu, więc nie trzeba pętle.

[vals, order] = sort(matrix,2); 
[r,c] = size(matrix); 
index = bsxfun(@plus, order, (0:r-1)'*c); 
data = data'; 
reordered_data = data(index')'; 
Powiązane problemy