Ranking of a cell array

2019-09-08 16:09发布

问题:

Take the following example:

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));

Here, Final represents the values gained by multiplying every possible combination of 'Name1'. Now, I'm trying to find a way of changing the order of 'Final' to correspond to the ranking order defined by 'Rankd'. For example the first 'line' of Final should read 'Data2 'Data3' 19.2; and the last 'line' should read 'Data1' Data4' 49.6.

Is there a method for doing this?

回答1:

There are a couple of options. Firstly, you could use the second output of sort, which gives you the indexes corresponding to the entries in the sorted array:

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

and then do

>> 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]

However, an even easier method is to use the function sortrows which was designed for exactly this situation:

>> 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]