Как заставить MATLAB отображать индекс минимального значения в 2D массиве? - PullRequest
18 голосов
/ 22 февраля 2011

Я пытаюсь написать скрипт в MATLAB, который находит местоположение минимального значения двумерного массива чисел.Я уверен, что в этом массиве есть только 1 минимум, поэтому наличие нескольких мест в массиве с одинаковым минимальным значением не является проблемой.Я могу найти минимальное значение массива, но в массиве 30x30 я хотел бы знать, в какой строке и столбце находится это минимальное значение.

Ответы [ 5 ]

28 голосов
/ 22 февраля 2011

В качестве альтернативной версии, объедините min, чтобы получить минимальное значение, и найдите, чтобы вернуть индекс, если вы уже вычислили минимум, тогда просто используйте find.

>> a=magic(30);
>> [r,c]=find(a==min(min(a)))

r =
     1
c =
     8

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

>> a=magic(30);
>> locn=(a==min(min(a)));
13 голосов
/ 22 февраля 2011

Вы можете преобразовать матрицу в вектор, найти индекс минимума, используя MIN , а затем преобразовать этот линейный индекс в индекс матрицы:

>> x = randi(5, 5)

x =

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

>> [value, index] = min(reshape(x, numel(x), 1));
>> [i,j] = ind2sub(size(x), index)

i =

     3


j =

     2
7 голосов
/ 22 февраля 2011

Посмотрите описание функции min . Может возвращать как минимальное значение, так и индекс. Для двумерного массива просто вызовите его дважды.

A = rand(30); % some matrix
[minColVal, minColIdx] = min(A);
[minRowVal, minRowIdx] = min(minColVal);

minVal = minRowVal;
minValIdx = [minColIdx(minRowIdx), minRowIdx];

Edit: решение @ b3, вероятно, вычислительно более элегантно (быстрее и требует меньше временного пространства)

0 голосов
/ 16 октября 2015

Будет работать альтернативное решение с использованием встроенной функции.

    >> min_index = @(matrix) find(matrix == min(reshape(matrix, [1,numel(matrix)])));

    >> a=magic(30);
    >> [r,c]=min_index(a)

    r =
         1

    c =
         8
0 голосов
/ 13 апреля 2013

Чтобы найти минимальное или максимальное значение в подмножестве вектора - Если A является вектором, а «lowerBound» и «upperBound» являются границами вектора, среди которых вам нужно найти максимальное (или минимальное) значение, то используйте эту команду -

[Value,Index]=min(A(lowerBound:upperBound));

Возвращает значение в качестве минимального или максимального значения между A (lowerBound) и A (uppedBound) и «Индекс» как с «lowerBound» в качестве смещения. Таким образом, чтобы найти абсолютный индекс, вам нужно добавить «lowerBound» в индекс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...