How to find the index of the minimum value in a matrix.

조회 수: 469 (최근 30일)
Micaiah Barletta
Micaiah Barletta 2022년 1월 19일
댓글: Umar 2024년 8월 7일
Hi everyone,
So I have a 9x21 matrix, V, and I am trying to find the index (i,j) of the minimum (closest to zero) value in that matrix. I have tried using several forms of the min function, but it keeps returning multiple indices for the the minimum values in each column. I only want one index (i,j), that of the minimum value in the ENTIRE matrix.
How would I go about doing this? Thanks!

답변 (5개)

Stephen23
Stephen23 2022년 1월 19일
편집: Stephen23 2022년 1월 19일
Where M is your matrix:
[R,C] = find(M==min(M(:)))
or
[~,X] = min(M(:)); % or [~,X] = min(M,[],'all','linear');
[R,C] = ind2sub(size(M),X)
  댓글 수: 4
Image Analyst
Image Analyst 2022년 1월 19일
Try
% Sample data between -2.5 and +2.5
M = 5 * rand(5, 10) - 2.5
M = 5×10
2.2558 2.0285 0.7944 2.3343 0.7202 0.8739 -0.0449 -1.9158 -1.0654 -1.8531 -0.9877 1.7554 2.4745 -2.4179 0.1576 1.4184 0.2105 1.1018 2.1986 -2.3464 0.0450 2.3143 -0.8332 2.0228 0.1946 -0.5806 -0.5764 1.6439 -1.6989 1.2254 -1.1251 -0.8863 0.5182 -0.3079 -2.0536 -0.3036 1.9644 -1.4574 -0.9964 1.8352 -0.9463 -0.9253 0.9574 -0.8925 0.3358 1.1363 -2.4485 -2.0140 0.0612 0.1545
% Find value closest to 0:
minValue = min(abs(M(:)))
minValue = 0.0449
[r, c] = find(abs(M) == minValue)
r = 1
c = 7
Umar
Umar 2024년 8월 7일
Hi Micaiah Barletta,
When you mentioned , “ I wanted the value that was closest to zero”, Hope this is what you meant
% Define a 9x21 matrix with manual values V = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21; 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42; 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63; 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84; 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105; 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126; 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147; 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168; 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189];
% Display the matrix
disp('The 9x21 matrix V with manual values:');
disp(V);
% Calculate the absolute differences between each element and zero
abs_diff = abs(V - 0);
% Find the linear index of the element with the minimum absolute difference
[~, linear_index] = min(abs_diff(:));
[i, j] = ind2sub(size(V), linear_index);
disp('Linear index of the value closest to zero:');
disp(linear_index);
disp('Row and column indices of the value closest to zero:');
disp([i, j]);
Please let us know if you have any further questions.

댓글을 달려면 로그인하십시오.


Yusuf Suer Erdem
Yusuf Suer Erdem 2022년 1월 19일
Hi, did you try it with this way. It gives the index which has the smallest number.
a=[8 2 5 1;2 -2 4 0;9 5 4 8];
[r,c]=find(a==min(a(:)))
  댓글 수: 5
Yusuf Suer Erdem
Yusuf Suer Erdem 2022년 1월 19일
I'll take a look when I arrive to home.
Yusuf Suer Erdem
Yusuf Suer Erdem 2022년 1월 20일
Hi, I strived a lot on your codes but I finally achieved it. The codes which are below works. I am glad if you accept my answer;
clc; clear;
a = rand(9,21);
b= 0;
differences = abs(a-b)
minDiff = min(differences);
closestValue = min(minDiff);
[r c]=find(a==closestValue)

댓글을 달려면 로그인하십시오.


Steven Lord
Steven Lord 2022년 1월 20일
Since you're using release R2021b (according to the information listed on the right side of this page) you can use 'all' as the dimension input and specify both the ComparisonMethod parameter and the 'linear' option.
M = randn(6)
M = 6×6
0.9423 0.3336 0.1760 1.0120 1.5974 -0.7014 -2.2171 -0.4520 -0.2327 -0.8261 -0.9182 -0.8860 0.7431 -0.7179 -0.2381 0.0671 0.9823 -1.0860 1.6596 -0.9416 -0.0795 -0.2284 -1.1704 -0.8441 -0.4919 -0.3952 0.6310 2.4187 -0.0775 0.2292 0.1780 0.3546 -0.3958 0.1260 -0.0577 0.7462
[minValue, minIndex] = min(M, [], 'all', 'linear', 'ComparisonMethod', 'abs')
minValue = -0.0577
minIndex = 30
For this particular random matrix, the entry with the smallest absolute value is the element with linear index 30.

Umar
Umar 2024년 8월 7일
편집: Umar 2024년 8월 7일

Hi @Micaiah Barletta,

To address your comments about, “So I have a 9x21 matrix, V, and I am trying to find the index (i,j) of the minimum (closest to zero) value in that matrix. I have tried using several forms of the min function, but it keeps returning multiple indices for the the minimum values in each column. I only want one index (i,j), that of the minimum value in the ENTIRE matrix. How would I go about doing this?”

First, I will defined the matrix 'V' as a 9x21 matrix by using the 'randn' function for demonstration purposes. Note: please replace this with your actual matrix data. Then, I use the min function to find the minimum value in the entire matrix 'V'. Afterwards, I employed find function to locate the linear index of the minimum value. Finally, the ind2sub function is utilized to convert the linear index to the corresponding row and column indices.

% Define matrix V (9x21)

V = randn(9, 21); % Example: Generating a random matrix for demonstration

disp('Matrix V:');

disp(V);

% Find the minimum value in the entire matrix

min_value = min(V(:));

disp('Minimum value in matrix V:');

disp(min_value);

% Find the linear index of the minimum value

[min_row, min_col] = find(V == min_value, 1, 'first');

disp('Linear index of the minimum value:');

disp([min_row, min_col]);

% Convert linear index to row and column indices

[i, j] = ind2sub(size(V), min_row);

disp('Row and column indices of the minimum value:');

disp([i, j]);

Please see attached.

Hope this helps. Please let me know if you have any further questions.

  댓글 수: 2
Stephen23
Stephen23 2024년 8월 7일
"Afterwards, I employed find function to locate the linear index of the minimum value."
[min_row, min_col] = find(V == min_value, 1, 'first'); % the outputs are NOT linear indices
MIN_ROW is not a linear index. It is the row subscript index.
MIN_COL is not a linear index. It is the column subscript index.
The part of the code commented "Find the linear index of the minimum value" does not find the linear index of the minimum value. It finds the row and column subscript indices of the minimum value.
The part of the code commented "Convert linear index to row and column indices" does not convert a linear index, because there is no linear index anywhere in any of that code:
[i, j] = ind2sub(size(V), min_row); % 2nd input is NOT a linear index
"Finally, the ind2sub function is utilized to convert the linear index to the corresponding row and column indices."
A simple sanity check shows that the last part also does not work as described: the claim is that the minimum value is at row=2 and column=1. Here is (apparently) the minimum value shown in the author's own screenshot:
It is clear that its location is nowhere near row=2 column=1.
Umar
Umar 2024년 8월 7일
Hi @Stephen23,
I highly appreciate your input and thorough analysis of my code. I did realize after reading your comments that it provided attempts to find the minimum value in the matrix V and its corresponding row and column indices and misconception of the usage of linear indexing. So, after reviewing everyone’s comments on this post and OP’s comments again, the proposed solution is what you suggested earlier which is simply finding the linear index of the minimum value in the entire matrix by directly using the min function with linear indexing (V(:)).

댓글을 달려면 로그인하십시오.


Umar
Umar 2024년 8월 7일

Hi @ Micaiah Barletta,

Since you have not click “Answer Accepted”, please see revised code below.

% Define a 9x21 matrix with manual values

V = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21; 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42; 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63; 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84; 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105; 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126; 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147; 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168; 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189];

% Display the matrix

disp('The 9x21 matrix V with manual values:');

disp(V);

% Find the linear index of the minimum value in the entire matrix

[~, linear_index] = min(V(:));

[i, j] = ind2sub(size(V), linear_index);

disp('Linear index of the minimum value:');

disp(linear_index);

disp('Row and column indices of the minimum value:');

disp([i, j]);

Please see attached results.

Hope this helps.

카테고리

Help CenterFile Exchange에서 Matrix Indexing에 대해 자세히 알아보기

제품


릴리스

R2021b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by