2013-11-26 4 views
1

Как я могу отсортировать матрицу с использованием определенного столбца с изменением направления? Я пробовал это, но не работает.matlab - сортировать ячейки в соответствии с режимом

data: 
    A1 5 P19 
    A2 7 P45 
    A3 8 P7 

[Y,I] = sort(data(:,3), 'descend'); 
B = data(Y,3); 

мне нужно получить:

In Ascending 
    A3 8 P7 
    A1 5 P19 
    A2 7 P45 

In descending: 
     A2 7 P45 
     A1 5 P19 
     A3 8 P7 

Спасибо за вашу помощь.

+0

Пожалуйста, укажите ваш код (включая входные данные) таким образом, это может быть скопированы для воспроизведения вашей проблемы. Я предполагаю, что данные являются ячейкой? Не уверен в этом. Какое сообщение об ошибке вы получаете? – Daniel

+0

Ваша проблема в том, что 'P19' приходит перед 'P7' из-за сортировки словаря. Вам нужно иметь «P07», чтобы иметь возможность сортировать, как вы планируете – Oleg

ответ

3

Для сортировки в алфавитных порядке (не то, что вы хотите) в соответствии с колонкой 3:

[Y,I] = sort(data(:,3)); %// I gives the indices of sorted rows 
B_asc = data(I,:); %// ascending 
B_des = data(I(end:-1:1),:); %// descending 

Для сортировки в численного порядка (который, кажется, что вы хотите) в соответствии с колонкой 3 без "P":

aux = strvcat(data(:,3)); %// put column 3 into matrix form, with trailing spaces 
[Y,I] = sort(str2num((aux(:,2:end)))); %// convert to number and sort 
B_asc = data(I,:); %// ascending 
B_des = data(I(end:-1:1),:); %// descending 
+0

Цистерны. Я получаю ошибку при сортировке режима определения. Как будто режим не может применяться к массиву ячеек. Я дам вам точное сообщение. – TimeIsNear

+0

@TimeIsNear. Вы правы, режим не поддерживается ячейками. См. Обновленный ответ –

3

Если предположить, что данные матрица клетки:

A = {'A1' 5 'P19'; 'A2' 7 'P45'; 'A3' 8 'P7'}; 
temp = char(A(:,3)); 
temp = str2num(temp(:,2:end)); %get rid of the P 

[~,idx1] = sort(temp,'ascend') 
A(idx1,:) 

даст вам:

'A3' [8] 'P7' 
'A1' [5] 'P19' 
'A2' [7] 'P45' 

и

[~,idx2] = sort(temp,'descend') 
A(idx2,:) 

даст вам:

'A2' [7] 'P45' 
'A1' [5] 'P19' 
'A3' [8] 'P7' 

Если ваши данные могут быть изменены на:

A = {'A1' 5 'P19'; 'A2' 7 'P45'; 'A3' 8 'P07'}; 

было бы все проще, как все изначально думали здесь:

B = sortrows(A,3); 
C = flipud(B); 

B = 

    'A3' [8] 'P07' 
    'A1' [5] 'P19' 
    'A2' [7] 'P45' 


C = 

    'A2' [7] 'P45' 
    'A1' [5] 'P19' 
    'A3' [8] 'P07' 
+0

. Спасибо. У меня более 6000 строк для сортировки. Я увижу, какой метод занимает меньше времени. – TimeIsNear

Смежные вопросы