Get max value and index of multidimensional array
    137 views (last 30 days)
  
       Show older comments
    
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
0 Comments
Answers (4)
  ChristianW
      
 on 13 Feb 2013
        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 Comments
  Nathan White
 on 25 May 2017
				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
 on 11 Jan 2022
        
      Edited: David McMahon
 on 11 Jan 2022
  
      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 Comment
  Steven Lord
    
      
 on 12 Jan 2022
				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)
A = randi([-10 10], sz); % random array
% Your first line
[maxValue, maxInd] = max(A, [], "all", "linear")
% 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)
% Convert the subscript indices back into a linear index
checkInd = sub2ind(size(A), d{:})
% Use the subscript indices to get the element from A
checkValue = A(d{:})
  Youssef  Khmou
      
 on 13 Feb 2013
        
      Edited: Youssef  Khmou
      
 on 13 Feb 2013
  
      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 Comments
  Youssef  Khmou
      
 on 13 Feb 2013
				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
      
 on 13 Feb 2013
				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
 on 12 Feb 2018
        
      Edited: Anxo Tato
 on 12 Feb 2018
  
      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 Comment
  Mohammad Torabi
 on 27 Jul 2021
				
      Edited: Mohammad Torabi
 on 27 Jul 2021
  
			Good, I found an easier way to get column:
[value,column] = max(max(A));
[~,row] = max(A(:,column));
See Also
Categories
				Find more on Matrices and Arrays in Help Center and File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!






