function find_components_example(example)
%FIND_COMPONENTS_EXAMPLE gives an example usage of find_components.
%
% Example:
% find_components_example(0) % a small example, with lots of printing
% find_components_example(1) % Doug's example, with lots of printing
% find_components_example(2) % a large example, just plotting
% find_components_example(A) % use the matrix A for the example
%
% See http://blogs.mathworks.com/pick/2008/08/18 for Doug Hull's description of
% the problem this m-file solves. With no inputs, Doug's example is used.
%
% See also FIND_COMPONENTS, LARGEST_COMPONENT, DMPERM, GPLOT
% Copyright 2008, Tim Davis, University of Florida
%-------------------------------------------------------------------------------
% construct an image
%-------------------------------------------------------------------------------
if (nargin < 1)
example = 1 ;
end
if (example == 0)
A = [ 1 2 2 3
1 1 2 3
0 0 1 2
0 1 3 3 ] ;
elseif (example == 1)
A = [ 2 2 1 1 2
3 0 1 0 1
3 2 2 2 1
1 2 2 1 2
0 3 2 0 1 ] ;
elseif (example == 2)
A = round (rand (30) * 2) ;
else
A = example ;
end
[m n] = size (A) ;
%-------------------------------------------------------------------------------
% find all of its components
%-------------------------------------------------------------------------------
tic
[p r nc G xy] = find_components (A,1) ;
t = toc ;
fprintf ('Image size: %d-by-%d, time taken: %g seconds\n', m, n, t) ;
%-------------------------------------------------------------------------------
% walk through the components, plotting and printing them.
%-------------------------------------------------------------------------------
prompt = 'hit enter to single-step, ''a'' to show all, ''q'' to quit: ' ;
small = (max (m,n) <= 10) ;
dopause = 1 ;
for k = 1:nc
% get the nodes of the kth component
nodes = p (r (k) : r (k+1)-1) ;
% for large graphs, do not show components of size 1
if (~small && length (nodes) == 1)
continue
end
% plot the graph with the kth component highlighted
hold off
gplot (G, xy, '-') ;
hold on
[X,Y] = gplot (G * sparse (nodes, nodes, 1, m*n, m*n), xy, 'r-') ;
plot (X, Y, 'r-', 'LineWidth', 3) ;
axis ([0 n+1 0 m+1]) ;
a = A (p (r (k))) ;
siz = length (nodes) ;
Title = sprintf ('Graph component %d, size %d, value %g', k, siz, a) ;
title (Title, 'FontSize', 20) ;
label_nodes (xy, A, small, nodes) ;
drawnow
% print the image and the kth component, if the image is small
if (small)
fprintf ('\n%s\n', Title) ;
C = nan (m,n) ;
C (nodes) = a ;
fprintf ('A = \n') ; disp (A) ;
fprintf ('the component = \n') ; disp (C) ;
end
% pause, or prompt the user
if (dopause && (k < nc))
s = input (prompt, 's') ;
dopause = isempty (s) ;
if (~dopause && s (1) == 'q')
break ;
end
else
pause (0.5)
end
end
%-------------------------------------------------------------------------------
% plot the whole graph, no components highlighted
%-------------------------------------------------------------------------------
hold off
gplot (G, xy, '-') ;
title (sprintf ('%d connected components', nc), 'FontSize', 20) ;
axis ([0 n+1 0 m+1]) ;
label_nodes (xy, A, small)
%-------------------------------------------------------------------------------
function label_nodes (xy, A, small, nodes)
%LABEL_NODES label all the nodes in the plot
if (small)
[m n] = size (A) ;
for i = 1:m*n
text (xy (i,1), xy (i,2), sprintf ('%g', A (i)), 'FontSize', 20) ;
end
if (nargin == 4)
for i = nodes
text (xy (i,1), xy (i,2), sprintf ('%g', A (i)), ...
'FontSize', 20, 'Color', 'r') ;
end
end
end