2013-09-07 2 views
4

У меня есть структура массивов StockInfo в Matlab. Поля структуры StockInfo заключаются в следующем:Сортировка структуры массивов в Matlab

StockInfo = 

     Name: {10x1 cell} 
    Values: [10x6 double] 
    Return: [10x1 double] 

Мне нужно сортировать StockInfo на основе поля Return, так что каждый массив в структуры сортируется соответственно. Есть идеи, как это сделать?

+0

Ваша проблема не определена. У вас есть структурный массив, где каждая структура показана. Если вы хотите отсортировать массив структур, то это должно быть сделано на основе скалярного значения для каждого элемента, а не массива ... Пожалуйста, уточните – Amro

ответ

3

Вы можете сортировать структуры массивов на основе полей с функцией FileExchange nestedSortStruct (link).

B = nestedSortStruct(A, 'Return'); 
1

Раствора со встроенными функциями только может быть:

[~, ix] = sort(StockInfo.Return); 
StockInfo = struct(... 
    'Name', {StockInfo.Name{ix}}, ... 
    'Values', StockInfo.Values(ix), ... 
    'Return', StockInfo.Return(ix)); 

Заменять с неиспользованным идентификатором, если ваш Matlab старше и не поддерживает неиспользованные выходные аргументов.

+0

Вторая строка просто должна быть StockInfo = StockInfo (ix) – Trashman

+0

@Trashman, Name является массив 'cell'. Если я сделаю StockInfo (ix), я получу ячейку, а я хочу получить строку. – texnic

4

Как я уже говорил в комментарии выше, вы сомневаетесь. Я думаю, вы вводите в заблуждение структуры и структуры массивов. Это может помочь post.

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

Сначала я создать структуру массива а с некоторыми случайными данными:

% cell array of 10 names 
names = arrayfun(@(k) randsample(['A':'Z' 'a':'z' '0':'9'],k), ... 
    randi([5 10],[10 1]), 'UniformOutput',false); 

% 10x6 matrix of values 
values = rand(10,6); 

% 10x1 vector of values 
returns = randn(10,1); 

% 10x1 structure array 
StockInfo = struct('Name',names, 'Values',num2cell(values,2), ... 
    'Return',num2cell(returns)); 

Созданная переменная представляет собой массив структур:

>> StockInfo 
StockInfo = 
10x1 struct array with fields: 
    Name 
    Values 
    Return 

, где каждый элемент представляет собой структуру со следующим Поля:

>> StockInfo(1) 
ans = 
     Name: 'Pr3N4LTEi' 
    Values: [0.7342 0.1806 0.7458 0.8044 0.6838 0.1069] 
    Return: -0.3818 

Дальше сортировать это структура массива с помощью поля «возврата» (каждая структура имеет соответствующее скалярное значение):

[~,ord] = sort([StockInfo.Return]); 
StockInfo = StockInfo(ord); 

Результатом является то, что массив теперь сортируются по значениям «возврата» в порядке возрастания:

>> [StockInfo.Return] 
ans = 
    Columns 1 through 8 
    -0.3818 0.4289 -0.2991 -0.8999 0.6347 0.0675 -0.1871 0.2917 
    Columns 9 through 10 
    0.9877 0.3929 
+0

Примечание: 'struct (..)' обрабатывает массивы ячеек как специальные, поэтому приведенное выше создает массив структур 10x1, а не структуру с массивами в своих полях. Таким образом, если была возвращена 'return', а не' num2cell (возвращает) ', результат был бы иным (каждая структура в массиве имела бы поле« Return », содержащее массив 10x1, каждый из которых является копией исходного' return'). –

+0

Примечание: вызов поля массива структур (например, 'StockInfo.Return') дает разделенный запятыми список элементов этих структур. Поэтому '[StockInfo.Return]' дает массив. Затем он сортируется с помощью 'sort (..)', который возвращает перестановки 'ord'. Чтобы отсортировать строки, можно было бы сказать 'sort ({StockInfo.Name})', но это работает только для строк на данный момент, до будущей версии Matlab. –

+1

@EvgeniSergeev: Да, спасибо за разъяснение. 's = struct ('a', {11,22});' (обратите внимание на массив ячеек) - это [специальный синтаксис] (http: // www.mathworks.com/help/matlab/ref/struct.html), чтобы создать массив структур, эквивалентный: 's (1) .a = 11; с (2) .а = 22; '. Теперь, когда этот массив индексируется по точкам, он возвращает то, что называется [разделенным запятой списком] (http://www.mathworks.com/help/matlab/matlab_prog/comma-separated-lists.html). Поэтому '[s.a]' из предыдущего кода будет расширяться на '[s (1) .a, s (2) .a]'. Мы также могли бы захватить список в массив ячеек '{s.a}' или даже в несколько выходных переменных '[s1, s2] = s.a;' – Amro

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