How to find common centroids?
    8 visualizaciones (últimos 30 días)
  
       Mostrar comentarios más antiguos
    
    Ivan Shorokhov
      
 el 8 de Jul. de 2015
  
    
    
    
    
    Respondida: Guillaume
      
      
 el 8 de Jul. de 2015
            Given: I have coordinates of 5 center points. For example:
centroids = 
                []   [156,140]
                [114,167][156,141]
                [117,172][157,142]
                [155,140][]
                [153,141][]
Want: I want to find nearest common centroid. Such as:
Common_centroids =
                [156,140]
                [156,141]
                [157,142]
                [155,140]
                [153,141]
Currently done:
    % remove blank cells matlab
    centroids = centroids_test2'; centroids(cellfun(@isempty,centroids)) = [];
    % convert the contents of a cell array into a single matrix.
    centroid =[cell2mat(centroids')];       
    % find mean value                                  
    mean_centroid = round(mean(centroid));   
    % x coordinates of cenroid                                  
    centroid_x = centroid(:,1);   
    % y coordinates of cenroid                                            
    centroid_y = centroid(:,2);   
    %find x values more than mean                                          
    index1 = find(repmat(mean_centroid(1),length(centroid),1) < centroid_x);
    % find y values less than mean   
    index2 = find(repmat(mean_centroid(2),length(centroid),1) > centroid_y);  
    Common_centroids = [centroid_x(index1),centroid_y(index2)];
Here is the output:
Common_centroids = 
                        156  140
                        156  141
                        157  142
                        155  140
                        153  141
As you can see code itself is not robust at all, because I have to specify which mean value to find.
Needed: So I'm wondering, if there are any other better and more efficient way of doing it?
[ACKNOWLEDGMENTS]
Thanks in advance for any help.
I will vote for all your answers.
[MATLAB version]
R2014a
0 comentarios
Respuesta aceptada
  Guillaume
      
      
 el 8 de Jul. de 2015
        This is one way of doing it:
centroids = {[], [156 140]; [114 167], [156 141]; [117 172], [157 142]; [155 140], []; [153 141], []};
cmedian = median(vertcat(centroids{:}));
%convert centroids with a 3d array with [inf inf] for missing centroids
infcentroids = centroids;
infcentroids(cellfun(@isempty, centroids)) = {[inf inf]};
infcentroids = reshape(cell2mat(infcentroids), size(infcentroids, 1), 2, []);
%calculate square of euclidean distance from median:
edist = sum(bsxfun(@minus, infcentroids, cmedian).^2, 2);
%find minimum in each row:
[~, closest] = min(edist, [], 3);
%use that to index centroids:
common_centroids = cell2mat(centroids(sub2ind(size(centroids), (1:size(centroids, 1))', closest)))
0 comentarios
Más respuestas (1)
  Thorsten
      
      
 el 8 de Jul. de 2015
        I is not exactly clear to me what you want to achieve. To order C depending on distance to the mean:
C{1} = [];
C{2} = [156,140];
C{3} = [114,167];
C{4} = [156,141];
C{5} = [117,172];
C{6} = [157,142];
C{7} = [155,140];
C{8} = [];
C{9} = [153,141];
C = reshape(cell2mat(C), 2, [])';
[distCmean ind] = sort(sum((C - repmat(mean(C), [size(C,1) 1])).^2, 2));
C(ind)
1 comentario
  Ivan Shorokhov
      
 el 8 de Jul. de 2015
				
      Editada: Ivan Shorokhov
      
 el 8 de Jul. de 2015
  
			
		Ver también
Categorías
				Más información sobre Linear Algebra en Help Center y File Exchange.
			
	Productos
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!

