2010-05-13 2 views
2

Я хотел бы отсортировать элементы в списке, разделяемом запятой. Элементы в списке - это структуры, и я бы хотел, чтобы список сортировался в соответствии с одним из полей в структуре.Сортировка в Matlab

Например, учитывая следующий код:

L = {struct('obs', [1 2 3 4], 'n', 4), struct('obs', [6 7 5 3], 'n', 2)}; 

Я хотел бы иметь возможность сортировать L по полю «п». Функция сортировки Matlab работает только на матрицах или массивах и в списках строк (даже не в списках чисел).

Любые идеи о том, как это может быть достигнуто?

Спасибо,

Миха

+0

В качестве побочного примечания - сортировка не является самоочевидной. Вероятно, вам понадобится Natural Sort http://www.codinghorror.com/blog/2007/12/sorting-for-humans-natural-sort-order.html – Mikhail

ответ

6

Я предлагаю вам сделать это в три этапа: Extract «п» в массив, отсортировать массив и, следовательно, изменить порядок элементов массива ячеек.

%# get the n's 
nList = cellfun(@(x)x.n,L); 

%# sort the n's and capture the reordering in sortIdx 
[sortedN,sortIdx] = sort(nList); 

%# use the sortIdx to sort L 
sortedL = L(sortIdx) 
+2

, если вы используете новейшую версию MATALB, вы можете сделать ' [~, sortIdx] = sort (nList); '. Таким образом, у вас нет дополнительной переменной, лежащей вокруг. – JudoWill

+2

@JudoWill: Отличная новая функция, но я узнал, что она не была совместима с прошлым назад. Некоторые из моих коллег имеют более старые версии MATLAB, и мой код пришел в визг, когда они пытались запустить его. – Doresoom

+1

@JudoWill: Мне нравится эта функция, и я, вероятно, начну использовать ее через 2-3 года. – Jonas

0

Для чего это стоит, вот решение в Python:

L = [{'n': 4, 'obs': [1, 2, 3, 4]}, {'n': 2, 'obs': [6, 7, 5, 3]}] 
L.sort(lambda a,b: a['n'].__cmp__(b['n'])) 
# L is now sorted as you wanted 
2

Это немного в сторону, но если все структуры в массиве ячейки L имеют одинаковые поля (obs и n), тогда было бы более целесообразно хранить L в виде массива структуры 1 на N вместо массива ячеек 1 на 1 из структур 1 на 1.

Чтобы преобразовать массив ячеек 1-на-N структур в структуры массива с 1-по-N, вы можете сделать следующее:

L = [L{:}]; 

Или, вы можете создать массив структуры непосредственно с помощью одного звоните в STRUCT вместо того, чтобы создавать массив ячеек структур, как вы делали в вашем примере:

L = struct('obs',{[1 2 3 4],[6 7 5 3]},'n',{4,2}); 

solution from Jonas Теперь становится еще проще:

[junk,sortIndex] = sort([L.n]); %# Collect field n into an array and sort it 
sortedL = L(sortIndex);   %# Apply the sort to L 
+0

+1 для упрощения вопроса сначала – Jonas

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