Выберите x наименьших элементов в Matlab

У меня есть матрица целочисленных значений, ось x представляет разные дни, а ось y представляет час дня. И в каждой ячейке есть число, указывающее, сколько часов в сутках соответствует каким-то критериям дня, которое просто происходит. Вот почему мне нужно рассчитать его за каждый час, а не только в конце времени.

Вся проблема в том, что я должен выбрать 5 лучших дней с наименьшим числом (наименее соответствующим). Таким образом, в матрице это означает выбрать 5 самых низких чисел в строке и запомнить индексы столбцов, где находится минимум. (Мне нужно знать, в какой день это произошло). Потому что каждый раз, когда время идет, может быть 5 разных дней, поэтому сортировка всей таблицы приведет к беспорядку.

Я могу заставить его работать очень уродливо, взяв первое 5 число, а затем, когда я найду меньшее по пути, я забуду самый большой из 5 и запомню индекс столбца для нового. Тем не менее, это решение кажется довольно небрежным. В Matlab должен быть лучший способ решить эту проблему.

Любые идеи, функции, которые могут сделать мою жизнь проще?

1 1 0 1 1 1 0 0 1 1

1 2 1 2 2 1 0 1 2 2

Например, в этих двух строках, проиндексированных от 1 до 10, в первой строке он должен возвращать столбцы 3,7,8 и два других, на самом деле не заботясь о том, какой из них. Во второй строке он должен вернуть столбцы 7,8,6,1,3.


person Community    schedule 16.04.2013    source источник
comment
Пожалуйста, предоставьте образец ввода и желаемый результат.   -  person Oleg    schedule 16.04.2013
comment
Я не понимаю из вопроса, почему нельзя сортировать матрицу по строкам.   -  person nhowe    schedule 16.04.2013
comment
ну, в основном потому, что каждый раз, когда я сортировал бы таблицу, мне приходилось бы также сохранять индексы для столбцов, а следующая строка будет иметь как минимум разные столбцы, поэтому вам придется много сортировать плюс сохранять индексы, которые на самом деле не были бы эффективными.   -  person    schedule 16.04.2013
comment
возможный дубликат Найдите 5 самых высоких чисел в матрица 4x5   -  person Shai    schedule 16.04.2013
comment
Возможный дубликат Как найти индекс n наименьших элементов в векторе   -  person saastn    schedule 30.04.2016


Ответы (2)


A = randi(60,100,2);
[min_val,index] = sort(A(:,2),'ascend');    
output = [A(index(1:5),1) A(index(1:5),2)];

это должно помочь вам (я думаю);

person fpe    schedule 16.04.2013

Вероятно, одним из самых простых (но не самых эффективных) способов является использование функции sort (которая также возвращает отсортированные индексы):

>> [~,index] = sort([1 1 0 1 1 1 0 0 1 1]);
>> index(1:5)
ans =

     3     7     8     1     2

>> [~,index] = sort([1 2 1 2 2 1 0 1 2 2]);
>> index(1:5)

ans =

     7     1     3     6     8
person Sven Gowal    schedule 16.04.2013