Get max value and index of multidimensional array

조회 수: 338 (최근 30일)
Evan
Evan 2013년 2월 13일
댓글: Steven Lord 2022년 1월 12일
hello
i have an output value matrix depending on 3 inputs ranging from p10 to p11 , p20 to p21, p30 to p31. the output matrix is multidimensional depending on number of inputs. i want to write a function that gives the max value and its coordinates so to speak of the max value. matlabs max function only does 1 dimension.
any help would be grateful. thank you

답변 (4개)

ChristianW
ChristianW 2013년 2월 13일
Use 1D-Indexing:
M = randn(10,10,10,10);
[C,I] = max(M(:));
C
M(I)
This might be useful too:
[I1,I2,I3,I4] = ind2sub(size(M),I);
M(I1,I2,I3,I4)
  댓글 수: 2
Evan
Evan 2013년 2월 13일
The second part is exactly what I needed. Absolutely brilliant.
Thanks!
Nathan White
Nathan White 2017년 5월 25일
I tried using this myself, but I'm not understanding how to do it. I have a 10 x 10 x 10 matrix and I need to find which row, column and page gives the max value. Could you clarify a little more what you did here? Thanks.

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


David McMahon
David McMahon 2022년 1월 11일
편집: David McMahon 2022년 1월 11일
Using more modern versions of Matlab, I found a simple solution that works for any size of matrix:
In the case of, say, 3D:
[M,I] = max(A,[],"all","linear");
[dim1, dim2, dim3] = ind2sub(size(A),I)
  댓글 수: 1
Steven Lord
Steven Lord 2022년 1월 12일
To generalize the last line:
% Sample data
nd = randi([2 10]); % random integer between 2 and 10
sz = randi(4, 1, nd) % vector of nd integers representing size(A)
sz = 1×7
4 1 2 3 2 3 3
A = randi([-10 10], sz); % random array
% Your first line
[maxValue, maxInd] = max(A, [], "all", "linear")
maxValue = 10
maxInd = 58
% Allocate a cell array to contain the subscript indices
d = cell(1, ndims(A));
% Use the cell array as a comma-separated list to hold the indices
[d{:}] = ind2sub(size(A), maxInd)
d = 1×7 cell array
{[2]} {[1]} {[1]} {[2]} {[1]} {[2]} {[1]}
% Convert the subscript indices back into a linear index
checkInd = sub2ind(size(A), d{:})
s = 58
% Use the subscript indices to get the element from A
checkValue = A(d{:})
checkValue = 10

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


Youssef  Khmou
Youssef Khmou 2013년 2월 13일
편집: Youssef Khmou 2013년 2월 13일
Hi, try this function
function [Max,index] =Max3d(x)
N=size(x);
if length(N)<3
error(' Input 3D array');
end
[a,t]=max(x(:));
Max=a;
index1=ceil(t/(N(1)*N(2)));
%Now we find the slice that contains the Max
Temp=x(:,:,index1);
[index2,index3]=find(Temp==max(Temp(:)));
index=[index2;index3;index1]';
  댓글 수: 6
Youssef  Khmou
Youssef Khmou 2013년 2월 13일
ChrsitanW : please try the function and see if is it the same approach/ answer you gave or not .
Of course it also uses max(G(:)) but from there, you can find z coor, then x and y using built-in functions "ceil" and "find" .
ChristianW
ChristianW 2013년 2월 13일
Eheh, yeah its the same, but ind2sub is a validated function working for all dimensions. But its fine, your approach can be useful for someone.

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


Anxo Tato
Anxo Tato 2018년 2월 12일
편집: Anxo Tato 2018년 2월 12일
For a 2-D matrix this code can help. It calculates the indices (row and column) of the maximum (value) of a matrix A. Attention: It doesn't deal with multiple maximums!
function [row,column,value] = max_matrix(A)
[y,in] = max(A);
[value,column] = max(y);
[~,row] = max(A(:,column));
end
  댓글 수: 1
Mohammad Torabi
Mohammad Torabi 2021년 7월 27일
편집: Mohammad Torabi 2021년 7월 27일
Good, I found an easier way to get column:
[value,column] = max(max(A));
[~,row] = max(A(:,column));

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

카테고리

Help CenterFile Exchange에서 Resizing and Reshaping Matrices에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by