2015-08-07 13 views
4

Я попытался использовать функцию сортировки в Matlab. Есть ли способ использовать эту функцию или любую идею для сортировки строк матрицы, основанной на частоте элементов столбца этой матрицы.Как отсортировать строки матрицы, основанные на частоте элементов одного столбца?

В качестве примера: у меня есть эта матрица

matrix = [1 3 1; 
      1 4 2; 
      2 5 4; 
      3 2 3; 
      5 5 4; 
      5 3 3; 
      4 3 2; 
      4 2 3; 
      3 6 4; 
      2 4 3]; 

Я хотел бы получить что-то похожее на это:

sorted_based_on_3rd_col = [2 4 3; 
          3 2 3; 
          4 2 3; 
          5 3 3; 
          2 5 4; 
          3 6 4; 
          5 5 4; 
          1 4 2; 
          4 3 2; 
          1 3 1] 

, который сортируется на основе наиболее часто элемент на третьей колонке. Спасибо за любую помощь!

+0

Как порядок выбран тот же номер? Как упорядочиваются первые 4 элемента из 'sorted_based_on_3rd_col'? –

+0

@AnderBiguri На самом деле для этого выхода нет различий. Думаю, я смогу позже отсортировать их по первой колонке или второй. Правильно? – Jose

+0

Вы не можете сказать алгоритм «и с этим делать все, что хотите». Выберите способ, которым вы хотите их заказать! –

ответ

3

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

>> freq = accumarray(matrix(:,3), 1); 
>> [~, ind] = sort(freq(matrix(:, 3)), 1, 'descend'); % index that sorts matrix 
>> matrix(ind, :) % reshuffle matrix to sort 

ans = 

    3  2  3 
    5  3  3 
    4  2  3 
    2  4  3 
    2  5  4 
    5  5  4 
    3  6  4 
    1  4  2 
    4  3  2 
    1  3  1 

Если вы не все равно, вам нужно предварительно сортировать матрицу прежде всего. Поскольку сорт Matlab равен stable, это сохранит порядок элементов, которые будут равны во втором сортировке.

>> matrix = sortrows(matrix, 1) 

matrix = 

    1  3  1 
    1  4  2 
    2  5  4 
    2  4  3 
    3  2  3 
    3  6  4 
    4  3  2 
    4  2  3 
    5  5  4 
    5  3  3 

>> freq = accumarray(matrix(:,3),1); 
>> [~, ind] = sort(freq(matrix(:,3)), 1, 'descend'); 
>> matrix(ind, :) 

ans = 

    2  4  3 
    3  2  3 
    4  2  3 
    5  3  3 
    2  5  4 
    3  6  4 
    5  5  4 
    1  4  2 
    4  3  2 
    1  3  1 
4

Это один из способов:

x = matrix(:,3); 
[c,b] = histc(x,unique(x)) 
[~,idx] = sort(c(b),'descend') 
out = matrix(idx,:) 
+2

Второй вывод 'histc'-- хорошо продуман! –

+0

@thewaywewalk большое спасибо за ваш ответ. Это абсолютно правильно и полезно, но у меня есть только один выбор для лучшего ответа. – Jose

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