Ordering rows based on value
    3 views (last 30 days)
  
       Show older comments
    
Suppose I have a matrix of values as follows:
matches = [1,2;1,4;2,5;3,4;3,6;5,6;];
Is there a way to "connect these rows together based on a common value in the rows column. The desired result is as follows:
connected = [1,2,5,6,3,4,1]
0 Comments
Accepted Answer
  Andrei Bobrov
      
      
 on 13 Apr 2012
        k1 = bsxfun(@minus,matches(:,1),matches(:,2)');
[ii,jj] = find(k1 == 0);
a = unique([ii;jj]);
out1 = unique(matches(a,:)');
f=matches(setdiff(1:6,a),:);
[ff,bb,cc] = unique(f','first');
[~,id] = sort(bb,'descend');
out2 = ff(id);
connected = [out1;out2(2:end)]
More Answers (2)
  Geoff
      
 on 13 Apr 2012
        Try this:
matches = [1,2;1,4;2,5;3,4;3,6;5,6;];
connected = matches(1);
while size(matches,1) > 0
    [r,c] = find(matches == connected(end), 1);
    if isempty(r)
        disp('End of chain');
        break;
    end
    connected(end+1) = matches(r, 3-c);
    matches(r,:) = [];
end
disp(connected);
It's a little destructive. It systematically removes rows from the matches matrix until there are no more links or there are no rows left. It copes with ambiguity (if there is any) by selecting the first available value (determined by whatever find deems as the first value). In some some cases, this might end the chain prematurely.
3 Comments
  Geoff
      
 on 13 Apr 2012
				Well it depends on your data. For this data, it's fine. And maybe you'll always throw 'sane' data at it. I just imagined that some data sets won't produce a closed loop, will branch, or contain a side-loop that itself is closed.
Imagine the above data with [6 7; 7 8; 8 3] on it. If we happen to follow [6 7] instead of [3 6] then we'll touch all the values: [1 2 5 6 7 8 3 4 1]. But if we follow [3 6] first, we'll skip over the side-loop and produce the original output.
Anyway, I just think about that stuff, but I don't know what your data is representing or what its constraints are. If this solves your problem I'm happy. Don't forget to close off the question by accepting.
See Also
Categories
				Find more on Creating and Concatenating Matrices in Help Center and File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!

