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

Antworten (4)

ChristianW
ChristianW am 13 Feb. 2013

11 Stimmen

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 Kommentare

Evan
Evan am 13 Feb. 2013
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.

Melden Sie sich an, um zu kommentieren.

David McMahon
David McMahon am 11 Jan. 2022
Bearbeitet: David McMahon am 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 Kommentar

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

Melden Sie sich an, um zu kommentieren.

Youssef  Khmou
Youssef Khmou am 13 Feb. 2013
Bearbeitet: Youssef Khmou am 13 Feb. 2013

0 Stimmen

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 Kommentare

Youssef  Khmou
Youssef Khmou am 13 Feb. 2013
Bearbeitet: Youssef Khmou am 13 Feb. 2013
i tried to use ceil for referencing the slice, but i am not sure if that is true for each case.
ChristianW
ChristianW am 13 Feb. 2013
I dont get your reason for this.
@ChrisitanW : what do you mean ?
ChristianW
ChristianW am 13 Feb. 2013
  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" .
ChristianW
ChristianW am 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.

Melden Sie sich an, um zu kommentieren.

Anxo Tato
Anxo Tato am 12 Feb. 2018
Bearbeitet: Anxo Tato am 12 Feb. 2018

0 Stimmen

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 Kommentar

Mohammad Torabi
Mohammad Torabi am 27 Jul. 2021
Bearbeitet: Mohammad Torabi am 27 Jul. 2021
Good, I found an easier way to get column:
[value,column] = max(max(A));
[~,row] = max(A(:,column));

Melden Sie sich an, um zu kommentieren.

Kategorien

Gefragt:

am 13 Feb. 2013

Kommentiert:

am 12 Jan. 2022

Community Treasure Hunt

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

Start Hunting!

Translated by