How to find common centroids?
4 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
Ivan Shorokhov
le 8 Juil 2015
Réponse apportée : Guillaume
le 8 Juil 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 commentaires
Réponse acceptée
Guillaume
le 8 Juil 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 commentaires
Plus de réponses (1)
Thorsten
le 8 Juil 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 commentaire
Voir également
Catégories
En savoir plus sur Matrix Indexing dans Help Center et File Exchange
Produits
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!