Как найти заданное количество минимальных значений в матрице в MATLAB?

В настоящее время у меня есть матрица 4 * 5057 в MATLAB, называемая «cols». То, что я пытаюсь сделать, это найти минимальные значения k первой строки и сохранить их в новой матрице, называемой «минуты».

Итак, скажем, k равно 3, я бы хотел, чтобы функция сканировала всю первую строку «столбцов», выбирала 3 наименьших значения и копировала весь этот столбец в новую матрицу.

Я понимаю, как сделать конечную часть, но это просто обозначение того, как на самом деле написать функцию, которая находит не только одно наименьшее число, но и несколько, что ставит меня в тупик.

Я прочитал страницу MathsWorks о функции min, а также несколько других, которые появились в результате поиска, но безуспешно.

Любая помощь будет принята с благодарностью! Пожалуйста и спасибо вам!


person Kadin    schedule 05.05.2013    source источник
comment
Мне нужно найти k минимальных значений для первой строки, затем я буду использовать значения под ними (в том же столбце).   -  person Kadin    schedule 05.05.2013


Ответы (2)


Самый простой способ получить k самые высокие или самые низкие значения из вектора — это сначала sort, а затем просто взять первые (или последние) k значения.

Это не самый эффективный алгоритм, но, вероятно, он достаточно быстр для ваших целей.

В настоящее время у меня есть матрица 4 * 5057 в MATLAB, называемая «cols». То, что я пытаюсь сделать, это найти минимальные значения k первой строки и сохранить их в новой матрице, называемой «минуты».

Попробуй это:

v = cols(1, :);   % Get the first row of "cols"
v = sort(v);      % sort it    
mins = v(1:k);    % take the first k values

Если бы я отсортировал значения, повлияло бы это только на верхнюю строку матрицы? Поскольку мне также нужны значения под минимальными значениями, поэтому смешивать их на самом деле не желательно:/

Попробуй это:

mins = sortrows(cols.', 1).'
mins = mins(:, 1:k)

Или это:

v = cols(1, :);         % Get the first row of "cols"
[v, ix] = sort(v);      % sort it, and remember the permutation
mins = cols(:, ix(1:k))
person nibot    schedule 05.05.2013
comment
Если бы я отсортировал значения, повлияло бы это только на верхнюю строку матрицы? Поскольку мне также нужны значения под минимальными значениями, поэтому смешивать их на самом деле не желательно:/ - person Kadin; 05.05.2013
comment
Ах, я пропустил часть о всей колонке. В ответ добавлен некоторый код, который должен решить эту проблему. - person nibot; 05.05.2013
comment
Большое спасибо! У меня сейчас работает :D - person Kadin; 05.05.2013

Если вам необходимо сохранить постоянный порядок столбцов, sortrows может сделать работу. Так как sortrows работает со строками, мы должны транспонировать дважды. Расширяя ответ @nibot, мы имеем

   col_sorted = sortrows(cols')';
   k_min = col_sorted(:,1:k);

e.g.

   cols =  
           0.8147    0.9134    0.2785    0.9649
           0.9058    0.6324    0.5469    0.1576
           0.1270    0.0975    0.9575    0.9706

   sortrows(cols')' = 
           0.2785    0.8147    0.9134    0.9649
           0.5469    0.9058    0.6324    0.1576
           0.9575    0.1270    0.0975    0.9706

затем вам просто нужно извлечь первые k столбцов.

person Acorbe    schedule 05.05.2013
comment
Я буквально только что наткнулся на это! :D Я использовал почти такой же код. Большое спасибо :) - person Kadin; 05.05.2013