Сортировка в Matlab - PullRequest
       192

Сортировка в Matlab

2 голосов
/ 13 мая 2010

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

Например, с помощью следующего кода:

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

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

Есть идеи, как этого достичь?

Спасибо

Миха

Ответы [ 3 ]

6 голосов
/ 13 мая 2010

Я предлагаю вам сделать это в три этапа: извлечь 'n' в массив, отсортировать массив и, следовательно, переупорядочить элементы массива ячеек.

%# 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 голосов
/ 13 мая 2010

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

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

L = [L{:}];

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

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

Теперь решение от Jonas стало еще проще:

[junk,sortIndex] = sort([L.n]);  %# Collect field n into an array and sort it
sortedL = L(sortIndex);          %# Apply the sort to L
0 голосов
/ 13 мая 2010

Для чего оно стоит, вот решение в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...