18

I'm trying to write a script in MATLAB that finds the location of the minimum value of a 2D array of numbers. I am certain there is only 1 minimum in this array, so having multiple locations in the array with the same minimum value is not an issue. I can find the minimum value of the array, but in a 30x30 array, I would like to know which row and column that minimum value is in.

5 Answers 5

28

As an alternative version, combine min to get the minimum value and find to return the index, if you've already calculated the minimum then just use find.

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

r =
     1
c =
     8

Or depending on how you want to use the location information you may want to define it with a logical array instead, in which case logical addressing can be used to give you a truth table.

>> a=magic(30);
>> locn=(a==min(min(a)));
Sign up to request clarification or add additional context in comments.

Comments

13

You could reshape the matrix to a vector, find the index of the minimum using MIN and then convert this linear index into a matrix index:

>> 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

2 Comments

you may use x(:) instead of reshape() in order to save a few characters.
@zellus: Thank you for reminding me! I had this nagging feeling that there was another way to do it.
7

Look at the description of the min function. It can return the minimum value as well as the index. For a two dimensional array, just call it twice.

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

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

Edit: @b3's solution is probably computationally more elegant (faster and needs less temporary space)

Comments

0

To find min or max in a subset of a vector - If A is a vector and "lowerBound" and "upperBound" are the bounds of the vector among which you need to find the max (or min) value, then use this command -

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

This returns "Value" as the min or max value among A(lowerBound) and A(uppedBound) and "Index" as with "lowerBound" as the offset. So to find the absolute index, you need to add "lowerBound" to the Index.

Comments

0

An alternate solution using an inline function will work.

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

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

    r =
         1

    c =
         8

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.