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
Produits
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!