Borrar filtros
Borrar filtros

Sorting a list of edges

5 visualizaciones (últimos 30 días)
fabio freschi
fabio freschi el 13 de En. de 2014
Respondida: maryline bawedin el 27 de Oct. de 2016
Hi everybody, I have a list of edges defined as connectivity matrix, that defines a closed loop. For example:
edg = [1 4; 7 4; 8 2; 7 5; 3 8; 1 6; 5 2; 9 6; 3 9 ];
defines a closed loop made of 9 nodes numbered from 1 to 9. These edges are neither sorted nor equi-oriented. Now I would like to sort the edge list starting from the first edge to have an adjacent list of edges. In other words the desired output is
edg_sort = [1 4; 4 7; 7 5; 5 2; 2 8; 8 3; 3 9; 9 6; 6 1];
I was able to find a solution using a for-loop
% preallocate
edg_sort = zeros(size(edg));
% first edge
edg_sort(1,:) = edg(1,:);
% list of visited edges
edg_visited = zeros(size(edg,1),1);
edg_visited(1) = 1;
for i = 2:size(edg,1)
% node to search for
inod = edg_sort(i-1,2);
% indices of edges available
iedg = find(edg_visited == 0);
% find node (in local row indexing)
[idx,jdx] = find(edg(iedg,:) == inod);
% load new edge: first node
edg_sort(i,1) = inod;
% load new edge: second node
if jdx == 1
edg_sort(i,2) = edg(iedg(idx),2);
else
edg_sort(i,2) = edg(iedg(idx),1);
end
% update list of visited edges
edg_visited(iedg(idx)) = 1;
end
but I wonder whether it is possible to avoid the for-loop, maybe using the adjacency matrix or a similar structure. Any help is appreciated!
Thanks
Fabio

Respuestas (1)

maryline bawedin
maryline bawedin el 27 de Oct. de 2016
Hello...Late answer for this post. Here is what I did, a bit shorter code... Below, the variable "RegionEdgeIndex" (1st line) can be your "edg" list
RegionLeftEdgeIndexSorted= sortrows(RegionEdgeIndex, 1);
RegionLeftEdgeIndexSortedTemp= RegionLeftEdgeIndexSorted;
k=1;
RegionEdgeSorted(k,:)= RegionLeftEdgeIndexSortedTemp(1,:); %initialization
RegionLeftEdgeIndexSortedTemp(1,:)=[];
row=1;
while k<=length(RegionEdgeReferenceList)-1
[row,col] = find(RegionLeftEdgeIndexSortedTemp(:,1)== RegionEdgeSorted(k,2) );
k=k+1 ;
RegionEdgeSorted(k,:)=RegionLeftEdgeIndexSortedTemp(row,:)
RegionLeftEdgeIndexSortedTemp(row,:)=[];
end

Categorías

Más información sobre Graphics Object Programming en Help Center y File Exchange.

Community Treasure Hunt

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

Start Hunting!

Translated by