cell comparison with other cells in different rows
Mostrar comentarios más antiguos
I have a 6x2 cell array. Each cell is a 1x2 cell that contains an x and y co-ordinate. I want to be able to compare the contents of each cell of every row with the contents of each cell of the other rows. Each row of the cell array stands for a line. Essentially what I need to do is to determine which rows are connected together by finding the common endpoint.
I saw something on here that I think I can utilize. It's called nchoosek. This function basically finds all possible rows combination's for a give size. The following code uses this function. The problem that I am having is that I get all zero's for the keys.
endpoints = {{-24.7697910000000,-15.8191235000000},{-20.6771670000000,-3.54125200000000};{-12.6771670000000,20.4587480000000},{-20.6771670000000,-3.54125200000000};{-11.9803417500000,-14.5401785500000},{13.0196582500000,-12.0401785500000};{-11.9803417500000,-14.5401785500000},{-24.7697910000000,-15.8191235000000};{4.32283300000000,-1.04125200000000},{-12.6771670000000,20.4587480000000};{4.32283300000000,-1.04125200000000},{13.0196582500000,-12.0401785500000}};
comparisons = nchoosek(1:size(endpoints,1),2);
N = size(comparisons,1);
keys = cell(N,1);
for j = 1:N
keys{j}=isequal(endpoints{comparisons(j,1),:},endpoints{comparisons(j,2),:});
end
Respuesta aceptada
Más respuestas (1)
Andrei Bobrov
el 11 de Abr. de 2012
[EDIT] :)
ep = {{-24.7697910000000,-15.8191235000000},{-20.6771670000000,-3.54125200000000};
{-12.6771670000000,20.4587480000000},{-20.6771670000000,-3.54125200000000};
{-11.9803417500000,-14.5401785500000},{13.0196582500000,-12.0401785500000};
{-11.9803417500000,-14.5401785500000},{-24.7697910000000,-15.8191235000000};
{4.32283300000000,-1.04125200000000},{-12.6771670000000,20.4587480000000};
{4.32283300000000,-1.04125200000000},{13.0196582500000,-12.0401785500000}};
M = cell2mat(cellfun(@(x)cell2mat(x),ep,'un',0));
cmb = nchoosek(1:size(M,1),2);
ic = arrayfun(@(i1)any(ismember(M(cmb(i1,1),:),M(cmb(i1,2),:))),(1:size(cmb,1))');
pout = cmb(ic,:);
4 comentarios
Harold
el 11 de Abr. de 2012
Harold
el 11 de Abr. de 2012
Richard Brown
el 11 de Abr. de 2012
If you're only calling nchoosek with k of 2, you can go much higher than 15. The number of possible combinations is just n*(n-1)/2. And if nchoosek is too slow (once you get into the thousands), then you can easily do it with two nested loops.
Harold
el 12 de Abr. de 2012
Categorías
Más información sobre Creating and Concatenating Matrices en Centro de ayuda y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!