MATLAB: Saddle points of a 2D matrix

saddle points

the problem I'm working on is to find the saddle points of a matrix and now I'm trying this …
  • nested loop to check every element
  • check if the element is the smallest in its column and the biggest in its row
  • if it is,print it into the matrix'indices'
  • if there was none,print empty matrix….and the code [row,col]=size(matrix); for I=1:row for j=1:col if matrix (I,j)==max(matrix, I)&&matrix (I,j)==min(matrix, j) indices=[i j;]: else indices=[ ] end end endsome help with the syntax please,thanks!!

Best Answer

Here is a simple approach. Note I define a saddle point as one that is either the largest in its column and smallest in its row or the smallest in its column and largest in its row. Maybe you only want to look for the second kind in which case you can modify the approach accordingly.
Also this code is quite inefficient. You could further optimize it by finding and saving the column maximums, column minimums, row maximums and row minimums before entering the loop.
You could also probably vectorize this further and not use a loop at all, but I think you wanted to see how the basic syntax would look.
% make a matrix to try algorithm on
% there are saddle points at 2,2 and 4,4
A = [10 12 7 3 12;
3 10 6 2 8;
12 24 17 6 10;
15 21 10 8 12;
1 18 22 4 15];
disp A
% get dimensions of the matrix
[numRows,numCols] = size(A);
% preallocate array to hold indices for saddle points, there can be at most two
indices = zeros(2,2);
% loop through rows and columns of matrix
numSaddle = 0; % counter
for iRow = 1:numRows
for jCol = 1:numCols
% check if it is the biggest element in its row and smallest
% element in its column

brsc = A(iRow,jCol) == max(A(iRow,:)) && A(iRow,jCol) == min(A(:,jCol));
% check if is the smallest element in its row and biggest
% element in its column
srbc = A(iRow,jCol) == min(A(iRow,:)) && A(iRow,jCol)== max(A(:,jCol));
if brsc || srbc
numSaddle = numSaddle + 1;
indices(numSaddle,:) = [iRow,jCol];
end
end
end
% delete off the unused entries in the indices array
indices = indices(1:numSaddle,:);
% display the result
disp(indices)
% display saddle points
for k = 1:numSaddle
disp(A(indices(k,1),indices(k,2)))
end