Ранжирование клеточного массива - PullRequest
0 голосов
/ 01 марта 2012

Возьмите следующий пример:

clear all
Name1 = {'Data1','Data2','Data3','Data4'};
Data = {6.2,6,3.2,8};
CombnsName = nchoosek(Name1,2);
CombnsData = nchoosek(Data,2);

for i = 1:length(CombnsData);
    multiplied{i} = CombnsData{i,1}.*CombnsData{i,2};
end
multiplied = multiplied';
Final = [CombnsName, multiplied];
Rankd = sort(cell2mat(multiplied));

Здесь, Final представляет значения, полученные путем умножения каждой возможной комбинации «Name1».Теперь я пытаюсь найти способ изменить порядок «Финал», чтобы он соответствовал порядку ранжирования, определенному «Рангд».Например, первая «строка» финала должна читаться как «данные2», данные3 «19.2;и последняя «строка» должна читаться как «Данные1», Данные4 »49.6.

Есть ли способ сделать это?

1 Ответ

1 голос
/ 01 марта 2012

Есть несколько вариантов. Во-первых, вы можете использовать второй вывод sort, который дает вам индексы, соответствующие записям в отсортированном массиве:

>> [Rankd Index] = sort(cell2mat(multiplied));

, а затем сделать

>> Final(Index,:)

ans = 

    'Data2'    'Data3'    [19.200000000000003]
    'Data1'    'Data3'    [19.840000000000003]
    'Data3'    'Data4'    [25.600000000000001]
    'Data1'    'Data2'    [37.200000000000003]
    'Data2'    'Data4'    [                48]
    'Data1'    'Data4'    [49.600000000000001]

Однако еще более простой способ - использовать функцию sortrows, которая была разработана именно для этой ситуации:

>> sortrows(Final,3)

ans = 

    'Data2'    'Data3'    [19.200000000000003]
    'Data1'    'Data3'    [19.840000000000003]
    'Data3'    'Data4'    [25.600000000000001]
    'Data1'    'Data2'    [37.200000000000003]
    'Data2'    'Data4'    [                48]
    'Data1'    'Data4'    [49.600000000000001]
...