function p = rcm(A) % function p = rcm(A) % Reverse Cuthill-Mckee Algorithm for minimizing envelope profile % Input is expected to be some symmetric matrix A, though this % algorithm still works for a non symmetric matrix. [M,N] = size(A); p = zeros(M,1); e = spalloc(1,N,N); % vector for storing which nodes have been % labelled. If e(k) = 1, node k has been % labelled.If e(k) = 0, node k has not been labelled. % remove single unconnected nodes for k = 1:M deg = sum(abs(A(k,:))>0) - 1; % check kth row of A if (deg == 0) p(N) = k; e(k) = 1; N = N-1; end end % main loop while (N>0) % in case the graph is not connected nz = find(e==0); k = peripheral_node(A(nz,nz)); k = nz(k); e(k) = 1; v = [k]; [m,n] = size(v); while(n>0) k = v(1); t = find(((abs(A(k,:))>0) - e)>0); % find all adjacent nodes S % to node k that are not yet % labelled [mt,nt] = size(t); % sort through unlabelled adjacent S nodes deg = zeros(1,nt); for j = 1:nt deg(j) = sum(abs(A(t(j),:))>0) - 1; end [Y,I] = sort(deg); v = [v t(fliplr(I))]; % update labelled nodes with S sorted % in max deg e = e + (abs(A(k,:))>0); % label the adjacent nodes S as labelled e = (e>0); % reinitialize to ones and zeros. p(N) = v(1); N = N-1; v = v(2:end); [m,n] = size(v); end end