Asked by navan
on 20 May 2015

I have a (3*5) matrix i.e A=[1 2 3 4 5, 6 7 9 8 10, 11 12 14 13 15], i would like to find out the second largest element in each row and its location in the matrix. i expect 2 outputs 1)second_maxvalue_A=[4,9,14] 2)location_of_second_maxval=[4,3,3]

Answer by Guillaume
on 20 May 2015

Accepted Answer

One possible way is to find the largest values, replace them with a very small value (-Inf) and search for the new largest values:

A=[1 2 3 4 5; 6 7 9 8 10; 11 12 14 13 15] %your example A was a single row

m = max(A, [], 2); %find the max in each row

A(bsxfun(@eq, A, m)) = -Inf; %replace the max(s) by -Inf

m = max(A, [], 2) %find the new max which is the second largest.

navan
on 20 May 2015

Thanks Guillaume,

That works.thanks alot

zahra najjar
on 28 Oct 2018

what about the place!

Bruno Luong
on 28 Oct 2018

zahra najja: Please read the other ANSWERS bellow, or even better the DOC of MIN

Sign in to comment.

Answer by Thomas Koelen
on 20 May 2015

Edited by Thomas Koelen
on 20 May 2015

Edit: seems like I misread second largest...

, should be ;.

A=[1 2 3 4 5; 6 7 9 8 10; 11 12 14 13 15];

[m,i] = max(A,[],2)

gives you:

m =

5

10

15

i =

5

5

5

example:

A=rand(3,5);

[m,i] = max(A,[],2)

gives:

0.8147 0.9134 0.2785 0.9649 0.9572

0.9058 0.6324 0.5469 0.1576 0.4854

0.1270 0.0975 0.9575 0.9706 0.8003

m =

0.9649

0.9058

0.9706

i =

4

1

4

Thomas Koelen
on 20 May 2015

Finding second or third biggest can be done this way:

m=3;n=4;ggg = rand(m,n);

[svals,idx] = sort(ggg(:),'descend'); % sort to vector

svals(2) % second largest value

[II,JJ] = ind2sub([m,n],idx(2)) % position in the matrix

Guillaume
on 20 May 2015

Doesn't this find the second largest element in the matrix, rather than each row?

Secondly, if there are more than one element equal to the max, it still returns the max.

Guillaume
on 20 May 2015

A generic way of finding the nth largest value of each row, if it exists:

function nl = nthlargestrow(m, n)

%m: a 2d matrix to search

%n: an integer

%nl: cell array containing the nth largest value of each row. If a row does not have n different values, the cell is empty

nl = cell(size(m, 1), 1);

u = cellfun(@unique, num2cell(m, 2), 'UniformOutput', false);

hasnelements = cellfun(@numel, u) >= n;

nl(hasnelements) = cellfun(@(row) row(end-n+1), u(hasnelements), 'UniformOutput', false)

end

Sign in to comment.

Answer by Thorsten
on 20 May 2015

A=[1 2 3 4 5; 6 7 9 8 10; 11 12 14 13 15];

% remove highest value in each row

sz = size(A);

[~, ind] = max(A, [], 2);

ind = ind + [0; cumsum(repmat(sz(2), [sz(1)-1 1]))];

A = A';

A(ind) = [];

A = reshape(A, [sz(2)-1 sz(1)])';

% find highest value in each row (i.e., second largest of original matrix)

[max2, ind2] = max(A, [], 2);

Sign in to comment.

Opportunities for recent engineering grads.

Apply Today
## 0 Comments

Sign in to comment.