# how to find the element which is greater than or equal to its row and smaller or equal to its column in a matrix

250 views (last 30 days)

Show older comments

Muhammad Usman Saleem
on 14 Jun 2015

Hi everyone; I am going to find the saddle points of a matrix M. The question is given below...

Write a function called saddle that finds saddle points in the input matrix M. For the purposes of this problem, a saddle point is defined as an element whose value is greater than or equal to every element in its row, and less than or equal to every element in its column. Note that there may be more than one saddle point in M. Return a matrix indices that has exactly two columns. Each row of indices corresponds to one saddle point with the first element of the row containing the row index of the saddle point and the second column containing the column index. The saddle points are provided in indices in the same order they are located in M according to column-major ordering. If there is no saddle point in M, then indices is the empty array.

I am trying that code:

function indices = saddle(M)

[ rows,cols ] = size(M);

[valR,posR] = max(M,[],2);

[valC,posC] = min(M,[],1);

indices= [];

for i = 1:length(posR)

if i == posC(posR(i))

indices= [indices; i, posR(i)];

end

end

end

It is running fine. But when i test my code for

>> mat=zeros(5,3)

mat =

0 0 0

0 0 0

0 0 0

0 0 0

0 0 0

I am getting wrong output :

saddle(mat)

ans =

1 1

the correct output must be

saddle(mat)

ans =

1 1

2 1

3 1

4 1

5 1

1 2

2 2

3 2

4 2

5 2

1 3

2 3

3 3

4 3

5 3

What i am doing wrong?? Thanks in advance

##### 8 Comments

KRISH BHANDARI
on 18 May 2021

@Ahmet Burhan Baglar you are using the wrong logical operator . use single& not doubles .

### Accepted Answer

Stephen23
on 15 Jun 2015

Edited: Stephen23
on 15 Jun 2015

Copying code from the internet is not always a good way to learn best-practice coding: Solving this problem using loops misses using MATLAB's excellent code vectorization abilities. It would be much neater and faster to use bsxfun instead, like this:

function idx = saddle(mat)

row_mx = bsxfun(@ge,mat,max(mat,[],2));

col_mn = bsxfun(@le,mat,min(mat,[],1));

[R,C] = find(row_mx & col_mn);

idx = [R,C];

end

Which gives this:

>> saddle(zeros(5,3))

ans =

1 1

2 1

3 1

4 1

5 1

1 2

2 2

3 2

4 2

5 2

1 3

2 3

3 3

4 3

5 3

##### 4 Comments

Stephen23
on 31 Jul 2022

Edited: Stephen23
on 31 Jul 2022

@Akshay Padti: a simpler approach is to just replace the last line with this:

idx = [R(:),C(:)];

For example, using your test data:

saddle([1,2,3,4,4,3,2,1])

function idx = saddle(mat)

row_mx = bsxfun(@ge,mat,max(mat,[],2));

col_mn = bsxfun(@le,mat,min(mat,[],1));

[R,C] = find(row_mx & col_mn);

idx = [R(:),C(:)];

end

### More Answers (20)

vaishak p nair
on 26 Aug 2019

Write a function called saddle that finds saddle points in the input matrix M. For the purposes of this problem, a saddle point is defined as an element whose value is greater than or equal to every element in its row, and less than or equal to every element in its column. Note that there may be more than one saddle point in M. Return a matrix called indices that has exactly two columns. Each row of indices corresponds to one saddle point with the first element of the row containing the row index of the saddle point and the second element containing the column index. If there is no saddle point in M, then indices is the empty array.

solution :

function indices=saddle(M)

indices=[];

[a b]=size(M);

q=1;

for i=1:a

for j=1:b

x=M(i,:);

y=M(:,j);

c=M(i,j)>=x;

d=M(i,j)<=y;

if ~ismember(0,c) && ~ismember(0,d)

indices(q,1)=i;

indices(q,2)=j;

q=q+1;

end

end

end

end

##### 1 Comment

Tejas Sabu
on 13 Jun 2020

Edited: Tejas Sabu
on 13 Jun 2020

function indices=saddle(M)

[m,n] = size (M);

indices=[];%we want an empty matrix if there r no saddle points

for i=1:m; %going thru all the rows and each element of the row.

maxi=max(M(i,:));% finding the max of the elements of the specific row.

for j=1:n;% running thru all the coloumns and each element of the column .

mini=min(M(:,j));% finding the min of the elements of each column.

if maxi==mini%checking if the max of a row is same as the min of a column, if yes then

indices=[indices;i j];% indices will give null matrix in first column and i and j in the next row

end

end

end

hope this helps...try to understand the code instead of copying.

##### 4 Comments

Mert Yalcinoz
on 18 Feb 2022

Konstantinos Sofos
on 14 Jun 2015

Edited: Konstantinos Sofos
on 14 Jun 2015

Dear Muhammad,

You know it's very unfair continuously to ask the forum to solve your exercises/homework. I can understand you because also I was student and I wanted to solve my exercise to proceed but just as a friendly recommendation "Try to understand your exercises!". It's the only way to go one step further without cheating most of all yourself. The code that you posted has been posted before 4 days also to another programming forum Find saddle points in Matlab.

Now to your exercise. Your problem is very simple.

1. Take a piece of white paper and write down a matrix

2. Try to write down an algorithm

3. Write your own function

In my opinion this the way to learn programming. Good luck!

Regards,

##### 4 Comments

Jobin Geevarghese Thampi
on 18 Feb 2021

what is saddle point?what should be the answer after we execute the code?

the cyclist
on 14 Jun 2015

The reason your code doesn't give your expected result can be summarized by this sentence from the documentation for max: If the maximum value occurs more than once, then max returns the index corresponding to the first occurrence.

I think you were expecting it to return the indices of all the maxima.

Jaimin Motavar
on 3 Jul 2019

I hope this answer is helpful to you.

function indices = saddle(M)

[m,n]=size(M);

a=[];

for i=1:m

for j=1:n

if prod(M(i,j)>=M(i,:))==1 && prod(M(i,j)<=M(:,j))==1

a=[i,j;a];

end

end

end

indices=a;

end

##### 2 Comments

Naga
on 9 Aug 2021

Prod is the keyword for product. So, here it is going to multiply the elements in that matrix.

Divya Ratna
on 24 May 2020

i think anyone should try their own first rather than looking for answers in the community.

my attempt was this.

this passes all the test cases...

function indices = saddle (M)

s = size (M);

indices = [];

for ii = 1 : s(1)

maxy = max ( M(ii,:) );

for jj = 1 : s(2)

if M(ii,jj) == maxy;

miny = min (M(:,jj));

if M(ii,jj) == miny;

indices = [indices; ii jj];

end

end

end

end

end

##### 1 Comment

Garvit Kukreja
on 29 May 2020

can you help me with this.

Thankyou

function [indices] = saddle(z)

[ii jj ]= size(z)

indices = [];

for i=1:ii

for j=1:jj

x(i ,j)= [ z(i,j)]

end

[p,q]= max(x(i,:)) %max value in a row. p give max value, q gives column

for k=1:ii

y(k,q)= [z(k,q)]

end

[m,n]= min(y(:,q)) %min value in a row. m give min value, n gives column

if p==m

indices = [indices; i q]

end

end

end

SIVA SAI AKULA
on 29 Jul 2020

function indices = saddle(M)

row_max = max(M,[],2);

col_min = min(M,[],1);

[row,col]=find((M == row_max).*(M == col_min));

if isempty(col) || isempty(row)

indices=[]

else

for i=1:length(row)

indices(i,:)=[row(i),col(i)];

end

end

end

##### 0 Comments

Hicham Satti
on 7 Sep 2020

%Hope it will help you!!

function indices = saddle(M)

M;

%[row col] = size(M);

indices=[];

ind_row_col = [];

for i=1:row

for j=1:col

if ( M(i,j) >= M(i,:) & M(i,j) <= M(:,j) )

ind_row_col = [ind_row_col M(i,j)];

indices = [indices ; i,j];

end

end

end

##### 4 Comments

Image Analyst
on 11 Jul 2021

If you say

x = [x M(a, b)]

then x must exist in advance otherwise it won't know what to concatenate M onto. Even though x is an empty array, that's enough for it to exist and allow stuff to be stitched onto it.

charu sharma
on 27 Aug 2015

##### 0 Comments

Jos (10584)
on 3 Apr 2019

function out = saddle(M)

[r, c] = ind2sub(size(M), 1:numel(M)) ;

tf = arrayfun(@(r, c) all(M(r, c) >= A(:, c)) && all(M(r, c) <= M(r, :)), r, c)

out = [r(tf) ; c(tf)].'

##### 0 Comments

MADDINENI REVANTH SAI
on 31 Aug 2019

function s = saddle(M)

[r, c] = size(M);

s = [];

if r > 1

cols = min(M);

else

cols = M;

end

if c > 1

rows = max(M');

else

rows = M;

end

for ii = 1:c

for jj = 1:r

ifM(jj,ii) = cols(ii)&&M(jj)==rows(jj)

s = [s;jj ii];

end

end

end

##### 0 Comments

Muhammad Qaisar Ali
on 26 Jun 2020

another approch

function indices = saddle(Z)

indices=[];

for r=1:size((Z),1) % going through Rows

for c=1:size((Z),2) % going through Cols

if sum((Z(r,c)>=(Z(r,:))))>=size((Z),2) && sum((Z(r,c)<=(Z(:,c))))>=size((Z),1) % then saddle point

indices=[indices;[r,c]];

end

end

end

end

##### 2 Comments

Shiladittya Debnath
on 27 Jul 2020

For Function :

function id = saddle(M)

[a,b]=size(M);

id = zeros(a+b,2);

count = 0;

for i = 1:a

mah = max(M(i,:));

[c1,c2] = find(M(i,:) == mah);

for k = 1:length(c1)

c1k = c1(k); c2k = c2(k);

mic = min(M(:,c2k));

if M(i,c2k)==mic

count = count+1;

id(count,:) = [i,c2k];

end

end

end

id = id(1:count,:);

end

##### 0 Comments

Shiladittya Debnath
on 27 Jul 2020

And for Code to Call your Function :

% create an interesting surface

[X,Y] = meshgrid(-15:0.5:10,-10:0.5:10);

Z = (X.^2-Y.^2)';

% find saddle points

indices = saddle(Z)

% plot surface

surf(Z);

hold on

% mark saddle points with red dots in the same figure

for ii = 1:size(indices,1)

h = scatter3(indices(ii,2),indices(ii,1),Z(indices(ii,1),indices(ii,2)),'red','filled');

h.SizeData = 120;

end

% adjust viewpoint

view(-115,14);

hold off

##### 0 Comments

Abdul Quadir Khan
on 6 Nov 2020

function indices = saddle(M)

row_max = max(M,[],2);

col_min = min(M,[],1);

[row,col]=find((M == row_max).*(M == col_min));

if isempty(col) || isempty(row)

indices=[]

else

for i=1:length(row)

indices(i,:)=[row(i),col(i)];

end

end

end

##### 0 Comments

Mohamed El Nageeb
on 17 Dec 2020

this is my answer to this problem....it works fine but i feel like I complicated it. any tips for improvement?

function indices = saddle(M)

[r, c] = size(M);

indices=[];

for ii = 1 : r

for jj = 1 : c

req=0;

for k = 1 : c

if M(ii,jj) >= M(ii,k)

req = req +1;

end

end

for d = 1 : r

if M(ii,jj) <= M(d,jj)

req = req +1;

end

end

if req == (r+c)

indices = vertcat(indices,[ii,jj]);

end

end

end

##### 1 Comment

Rik
on 17 Dec 2020

If you're looking for code improvements: have you read the other solutions in this thread?

If not, why do you think others will read your answer and learn from it?

VIGNESH B S
on 8 Nov 2021

function indices = saddle(Z)

indices1 = []; %Creating a temporary matrix..

[r c] = size(Z);

for i = 1:r

row_sum = sum(Z(i,:)); %To obtain the sum of row

row_max = max(Z(i,:)); %To obtain max of row

for j = 1:c

col_sum = sum(Z(:,j)); %To obtain cum of column

col_min = min(Z(:,j)); %To obtain minimum of column.

if Z(i,j)>=row_max && Z(i,j)<=col_min %The logic -> matrix element should be greatest in row or more than the sum

%and also should be least of column.

mat = [i j];%a TEMPORARY to form a matrix with row and column of the saddle element.

indices1 = [indices1;mat]; %Now we just add it to the empty matrix.

end

end

end

indices = indices1;

end

##### 0 Comments

Salim Maharjan
on 3 Feb 2022

Edited: Salim Maharjan
on 3 Feb 2022

This code worked for me.

Function:

function indices=saddle(M)

[row,col]=size(M);

indices=[]; % Initializing the saddle points to an empty matrix

for ii=1:row

for jj=1:col

% Check if the element is greater than or equal to every element in its row

% and return its sum

A=sum(M(ii,jj)>=M(ii,:));

% Check if the element is less than or equal to every element in its column

% and return its sum

B=sum(M(ii,jj)<=M(:,jj));

%Provided than an element is saddle point, the following condition must hold

if isequal(A,col) && isequal(B,row)

indices=[indices,[ii,jj]]; %Adding the row index and column index of saddle point in matrix indices

end

end

end

end

##### 0 Comments

YUWEI LI
on 10 Jul 2022

##### 0 Comments

Yifan He
on 31 Jul 2022

function indices = saddle(M)

m = size(M,1);

n = size(M,2);

indices = [];

for i = 1:m

for j = 1:n

if (sum(M(i,j) >= M(i,1:end)) == n) & (sum(M(i,j) <= M(1:end,j)) == m)

indices = [indices;[i,j]];

end

end

end

##### 0 Comments

### See Also

### Categories

### Products

### Community Treasure Hunt

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

Start Hunting!