FormationControlSimulation/SOURCE/networks-toolbox/loops3rev2.m

60 lines
1.4 KiB
Matlab

% Function to find cycles of size 3.
% Note 1 (EY): Works for directed and undirected graphs.
% Note 2 (EY): Very slow, runs at O(N^3) time with brute force but works
% Note 3 (GB): Reduced time a bit by iterating through neighbor nodes instead of all nodes.
% Note 4 (GB): If there are self-loops, cycles can contain the same node multiple times.
%
% INPUTs: adjacency matrix, (square matrix of zeros and ones)
% OUTPUTs: list (cell) of 3-cycles;
%
% Other routines used: adj2adjL.m
% Erdem Yilmaz, January 20, 2016
% GB: Last updated, September 5 2016
function res = loops3rev2(A)
sA = size(A);
if (sA(1) ~= sA(2))
disp('loops3rev2(): Error - Input must be an adjacency (square) matrix.');
return;
end
AL = adj2adjL(A);
c=0;
tloops = {};
for i = 1:sA(1)
for j = 1:length(AL{i})
j = AL{i}(j);
for k = 1:length(AL{j})
k = AL{j}(k);
if A(k,i)==1
du = sort([i j k]);
du = strcat( num2str(du(1)),'-',num2str(du(2)),'-',num2str(du(3)) );
if sum(ismember(tloops,du))==0
if (i~=k&&k~=j)
c=c+1;
tloops{c} = du;
end
end
end
end
end
end
res = tloops;
if (c==0)
disp('No cycles of size three.');
else
disp(strcat('Number of 3-cycles:',num2str(c)));
end