Get max value and index of multidimensional array

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

Answers (4)

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

The second part is exactly what I needed. Absolutely brilliant.
Thanks!
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.

Sign in to comment.

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

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

Sign in to comment.

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

i tried to use ceil for referencing the slice, but i am not sure if that is true for each case.
I dont get your reason for this.
@ChrisitanW : what do you mean ?
  1. max(x(:)) is the same answer given twice and
  2. Why not just use ind2sub for index?
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" .
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.

Sign in to comment.

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

Good, I found an easier way to get column:
[value,column] = max(max(A));
[~,row] = max(A(:,column));

Sign in to comment.

Categories

Asked:

on 13 Feb 2013

Commented:

on 12 Jan 2022

Community Treasure Hunt

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

Start Hunting!