findout the second largest element in each row and its location in a matrix

107 views (last 30 days)
navan
navan on 20 May 2015
Answered: Steven Lord on 28 Oct 2018
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]

Accepted Answer

Guillaume
Guillaume on 20 May 2015
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.
  3 Comments
Bruno Luong
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.

More Answers (3)


Thomas Koelen
Thomas Koelen on 20 May 2015
Edited: 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
  3 Comments
Guillaume
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.


Thorsten
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);

Community Treasure Hunt

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

Start Hunting!