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

163 visualizzazioni (ultimi 30 giorni)
Muhammad Usman Saleem il 14 Giu 2015
Modificato: Stephen23 il 31 Lug 2022
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:
[ 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 :
ans =
1 1
the correct output must be
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 CommentiMostra 7 commenti meno recentiNascondi 7 commenti meno recenti
KRISH BHANDARI il 18 Mag 2021
@Ahmet Burhan Baglar you are using the wrong logical operator . use single& not doubles .

Accedi per commentare.

### Risposta accettata

Stephen23 il 15 Giu 2015
Modificato: Stephen23 il 15 Giu 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:
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:
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 CommentiMostra 3 commenti meno recentiNascondi 3 commenti meno recenti
Stephen23 il 31 Lug 2022
Modificato: Stephen23 il 31 Lug 2022
@Akshay Padti: a simpler approach is to just replace the last line with this:
idx = [R(:),C(:)];
For example, using your test data:
ans = 2×2
1 4 1 5
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

Accedi per commentare.

### Più risposte (20)

vaishak p nair il 26 Ago 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 :
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 CommentoMostra NessunoNascondi Nessuno
Travis Ha il 30 Lug 2020
Modificato: Travis Ha il 30 Lug 2020
I get everything except for c and d. How does it go through each row and column to find the saddle point? Can you just thoroughly explain how c and d works please?

Accedi per commentare.

Tejas Sabu il 13 Giu 2020
Modificato: Tejas Sabu il 13 Giu 2020
[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 CommentiMostra 3 commenti meno recentiNascondi 3 commenti meno recenti
Mert Yalcinoz il 18 Feb 2022
i didnt understand completly. when i wrote indices=[ii jj] in my code (i have extracted indices in the first row) it failed while testing row vector. why exactly??

Accedi per commentare.

Konstantinos Sofos il 14 Giu 2015
Modificato: Konstantinos Sofos il 14 Giu 2015
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.
1. Take a piece of white paper and write down a matrix 2. Try to write down an algorithm
In my opinion this the way to learn programming. Good luck!
Regards,
##### 4 CommentiMostra 3 commenti meno recentiNascondi 3 commenti meno recenti
Jobin Geevarghese Thampi il 18 Feb 2021
what is saddle point?what should be the answer after we execute the code?

Accedi per commentare.

the cyclist il 14 Giu 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.
##### 1 CommentoMostra NessunoNascondi Nessuno
Muhammad Usman Saleem il 14 Giu 2015
@the cyclist thanks for contributions... But i hope the refer link is not solution of my problem?? I am getting 1 1 for mat(5,3)?????

Accedi per commentare.

Jaimin Motavar il 3 Lug 2019
[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 CommentiMostra 1 commento meno recenteNascondi 1 commento meno recente
Naga il 9 Ago 2021
Prod is the keyword for product. So, here it is going to multiply the elements in that matrix.

Accedi per commentare.

Divya Ratna il 24 Mag 2020
i think anyone should try their own first rather than looking for answers in the community.
this passes all the test cases...
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 CommentoMostra NessunoNascondi Nessuno
Garvit Kukreja il 29 Mag 2020
can you help me with this.
Thankyou
[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

Accedi per commentare.

Muhammad Qaisar Ali il 26 Giu 2020
another approch
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 CommentiMostra 1 commento meno recenteNascondi 1 commento meno recente
Muhammad Qaisar Ali il 10 Ago 2020
I glad that it helped someone.

Accedi per commentare.

SIVA SAI AKULA il 29 Lug 2020
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 CommentiMostra -1 commenti meno recentiNascondi -1 commenti meno recenti

Accedi per commentare.

Hicham Satti il 7 Set 2020
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 CommentiMostra 3 commenti meno recentiNascondi 3 commenti meno recenti
Image Analyst il 11 Lug 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.

Accedi per commentare.

charu sharma il 27 Ago 2015
You should use two for loops to check for each element of a row and a column. Refer this for much simpler code: http://farzicoders.blogspot.in/2015/08/write-function-called-saddle-that-finds.html
##### 0 CommentiMostra -1 commenti meno recentiNascondi -1 commenti meno recenti

Accedi per commentare.

Jos (10584) il 3 Apr 2019
[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 CommentiMostra -1 commenti meno recentiNascondi -1 commenti meno recenti

Accedi per commentare.

MADDINENI REVANTH SAI il 31 Ago 2019
[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 CommentiMostra -1 commenti meno recentiNascondi -1 commenti meno recenti

Accedi per commentare.

Shiladittya Debnath il 27 Lug 2020
For Function :
[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 CommentiMostra -1 commenti meno recentiNascondi -1 commenti meno recenti

Accedi per commentare.

Shiladittya Debnath il 27 Lug 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)';
% 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
view(-115,14);
hold off
##### 0 CommentiMostra -1 commenti meno recentiNascondi -1 commenti meno recenti

Accedi per commentare.

Abdul Quadir Khan il 6 Nov 2020
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 CommentiMostra -1 commenti meno recentiNascondi -1 commenti meno recenti

Accedi per commentare.

Mohamed El Nageeb il 17 Dic 2020
this is my answer to this problem....it works fine but i feel like I complicated it. any tips for improvement?
[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 CommentoMostra NessunoNascondi Nessuno
Rik il 17 Dic 2020
If you're looking for code improvements: have you read the other solutions in this thread?

Accedi per commentare.

VIGNESH B S il 8 Nov 2021
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 CommentiMostra -1 commenti meno recentiNascondi -1 commenti meno recenti

Accedi per commentare.

Salim Maharjan il 3 Feb 2022
Modificato: Salim Maharjan il 3 Feb 2022
This code worked for me.
Function:
[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 CommentiMostra -1 commenti meno recentiNascondi -1 commenti meno recenti

Accedi per commentare.

YUWEI LI il 10 Lug 2022
function s = saddle(M) % Create logical vector that are true for each saddle condition separately minLocs = M <= min(M, [], 1); maxLocs = M >= max(M, [], 2); % Find the indices where both conditions are true! [row, col] = find(minLocs & maxLocs); % If the input is a row vector, row and col returned from the find % function need to be transposed to fit the output format if isrow(M) s = [row', col']; else s = [row, col]; end end
##### 0 CommentiMostra -1 commenti meno recentiNascondi -1 commenti meno recenti

Accedi per commentare.

Yifan He il 31 Lug 2022
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 CommentiMostra -1 commenti meno recentiNascondi -1 commenti meno recenti

Accedi per commentare.

### Categorie

Scopri di più su Historical Contests in Help Center e File Exchange

### Community Treasure Hunt

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

Start Hunting!