2013-11-01 2 views
1

Этот список представляет собой минимальный пример ситуацииХороший способ сортировки, и удерживать показатели исходного списка в Matlab

list = [0.2 0.1 0.3 0.4 0.7 0.5 0.6 0.9 1.0]; 

реальной жизни я разбирайтесь

sorted_list = sort(list, 'descend'); 

Мне нужно, чтобы получить 10% индексов с наивысшими значениями в списке .

Моя попытка

% Take the amount of indexes to 10% 
limit = size(sorted_list); 
size = limit(1); 
limit = ceil(0.1*size); 

% find the index numbers from the original list which corresponds to the highest indexes 
for j = 1:limit 
    value = sorted_list(j); 
    for k = 1:size 
     if value == list(k) 
      refine_set(j) = k; 
      % here much resources used, should be able stop if matching 
      % early, so should be able to stop the for-loop somehow 
      % I do not want to use while-loop, since in some cases, this would cause 
      % infinite loop 
     end; 
    end; 
end; 

Я начинаю думать, что должен быть лучший способ сделать это. Функция max, похоже, не имеет параметра, который позволяет мне принимать индексы тех, которые представляют 10% максимальных значений.

Что такое хороший способ получить индексы исходного списка, которые представляют 10% максимальных значений в списке?

Что такое хорошая структура данных для этой задачи?

ответ

2

Matlab имеет функцию сортировки с двумя выходными значениями:

[B,IX] = sort(A,...) 

Там IX является перестановкой индексов, необходимых для получения отсортированного массива.

Как результат вам нужен следующий алгоритм:

[sorted_list, IX] = sort(list, 'descend'); 
limit = length(sorted_list); 
limit = ceil(0.1 * limit); 
refine_set = IX(1:limit); 

Примечание: Лучше использовать функцию length или numel вместо size, чтобы определить количество элементов в случае массива, так как функция size имеет два выхода (количество строк и столбца), и вы можете ошибочно использовать количество строк (равное 1) вместо количества столбцов.

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