Нахождение координат min и max матрицы без использования команд min / max - PullRequest
0 голосов
/ 24 октября 2018

У меня есть этот код, который показывает мне минимальное и максимальное значения из случайной матрицы без использования команд min / max:

   m = rand(5,5)*10
    mn = m(1);
    mx = m(1);
    for ii = 2:numel(m)
        if m(ii) < mn
            mn = m(ii);
            imn = ii;
        elseif m(ii) > mx
            mx = m(ii);
            imx = ii;
        end
    end
    disp(mx)
    disp(mn)

Как я также могу найти минимальную и максимальную координату / положение?Мне нужно сделать это только с помощью функции или цикла, и я использую Matlab версии 2018a

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Вы можете сделать это с помощью сортировки:

function [minVal, maxVal, cMin, cMax] = q52961181(m)
if ~nargin, m = rand(5,5); end
sz = size(m);
[v,c] = sort(m(:), 'ascend');
% at this point, the *linear* indices of the minimum and the maximum are c(1) and c(end),
% respectively.
[x,y] = ind2sub(sz, c([1,end]));
assert(isequal(numel(x), numel(y), 2)); % make sure we don't have repetitions
minVal = v(1); maxVal = v(2);
cMin = [x(1), y(1)];
cMax = [x(2), y(2)];

Или используя find:

function [minVal, maxVal, cMin, cMax] = q52961181(m)
if ~nargin, m = rand(5,5); end
[minVal,maxVal] = bounds(m,'all'); % "bounds" was introduced in R2017a
[cMin, cMax] = deal(zeros(1,2));
[cMin(1), cMin(2)] = find(m == minVal);
[cMax(1), cMax(2)] = find(m == maxVal);

(Это техническое решение обманывает, так как bounds вызывает min иmax внутри. Однако вы можете просто использовать собственный код, чтобы определить минимальное и максимальное значения.)

0 голосов
/ 24 октября 2018
A = rand(5,5);
B = A(:);
[B,I] = sort(B);
m_min = B(1);
m_max = B(end);
index_min = I(1);
index_max = I(end);
  • Генерация случайного массива
  • Преобразование массива в вектор
  • Сортировка вектора
  • Максимум - последний элемент
  • Минимум - первый элемент

Я изменил код, чтобы показать индексы экстремумов.Эквивалентные индексы в виде координат в массиве можно найти с помощью ind2subs

coord_max = ind2subs([5,5], index_max);
coord_min = ind2subs([5,5], index_min);
...