Hola amigos, llevo casi 2 semanas intentando programar lo siguiente, pero he conseguido nulos o casi-nulos resultados. Lo que quiero es lo siguiente.
Imaginen una matriz de 10x5, con todas sus con números del 1 al 49, sin repetir ningún número (con su primera entrada nula), y ordenada por columnas (ver ejemplo más abajo). Se tiene un vector (v) con 6 números al azar de esta matriz. Yo deseo saber, de estos 6 elementos, cuántos de ellos son colindantes.
Dos elementos son colindantes cuando se "están tocando" entre sí, pongo un ejemplo con una matriz más pequeña (este ejemplo NO cumple con el requisito de entrada (1,1) nula)
Si mi vector es , se puede observar que los números 1,7 y 8 son colindantes entre sí, porque "se tocan" en la matriz. Por tanto tengo 1 grupo de 3 colindantes; a parte, el 16 y 17 forman un segundo grupo de 2 colindantes; por último, el número 20 no es colindante (se dice que forma un grupo de 1 "número suelto")
Por tanto mi programa debería devolver un vector u que tenga tantas componentes como grupos hayamos encontrado, en este caso: , pues ha encontrado 3 grupos, el primero de 3 colindantes, el segundo de 2 colindantes, y el tercero de 1 "número suelto".
Otro ejemplo. Si con la matriz anterior hubiéramos cogido el vector aleatorio , podréis facilmente ver que el vector u será: pues son todos "números sueltos", excepto la pareja 7,8.
Espero que se haya entendido la idea, a ver si podéis echarme una mano. Recurro a vosotros en última instancia porque lo he intentado muchas veces. De hecho hice un programa en MatLab que me calcula cuántos números se tocan entre sí, pero "no sabe" distinguir entre grupos, es decir, en el primer ejemplo que puse (vector ) sólo reconoce que hay 5 elementos que se tocan entre sí, pero no sabe distinguir entre cuáles forman un grupo y cuáles forman el otro grupo. Mi código por si os pudiera ayudar es el que sigue (MatLab):
Por si alguien no lo entiende lo explico un poco por encima. Lo que mi programa hace es aprovechar el hecho de que los números están ordenados por columnas, para establecer una relación matemática a la condición de números colindantes. Si creáis una matriz como dije antes (matriz de 10x5, con todas sus entradas con números del 1 al 49, sin repetir ningún número, ordenada por columnas y con su primera entrada (1,1) nula) podréis observar por qué he creado las variables n1, n2, ... , n8.
Luego me vi en la necesidad de crear un vector temporal para ir borrando los elementos a medida que se encontraban. En este caso, como no se puede borrar, los sustituyo por -20, así me aseguro que nunca se encontrará de nuevo (pues todos los elementos deben ser positivos).
Un saludo amigos, a ver quién me echa una mano!
Imaginen una matriz de 10x5, con todas sus con números del 1 al 49, sin repetir ningún número (con su primera entrada nula), y ordenada por columnas (ver ejemplo más abajo). Se tiene un vector (v) con 6 números al azar de esta matriz. Yo deseo saber, de estos 6 elementos, cuántos de ellos son colindantes.
Dos elementos son colindantes cuando se "están tocando" entre sí, pongo un ejemplo con una matriz más pequeña (este ejemplo NO cumple con el requisito de entrada (1,1) nula)
Si mi vector es , se puede observar que los números 1,7 y 8 son colindantes entre sí, porque "se tocan" en la matriz. Por tanto tengo 1 grupo de 3 colindantes; a parte, el 16 y 17 forman un segundo grupo de 2 colindantes; por último, el número 20 no es colindante (se dice que forma un grupo de 1 "número suelto")
Por tanto mi programa debería devolver un vector u que tenga tantas componentes como grupos hayamos encontrado, en este caso: , pues ha encontrado 3 grupos, el primero de 3 colindantes, el segundo de 2 colindantes, y el tercero de 1 "número suelto".
Otro ejemplo. Si con la matriz anterior hubiéramos cogido el vector aleatorio , podréis facilmente ver que el vector u será: pues son todos "números sueltos", excepto la pareja 7,8.
Espero que se haya entendido la idea, a ver si podéis echarme una mano. Recurro a vosotros en última instancia porque lo he intentado muchas veces. De hecho hice un programa en MatLab que me calcula cuántos números se tocan entre sí, pero "no sabe" distinguir entre grupos, es decir, en el primer ejemplo que puse (vector ) sólo reconoce que hay 5 elementos que se tocan entre sí, pero no sabe distinguir entre cuáles forman un grupo y cuáles forman el otro grupo. Mi código por si os pudiera ayudar es el que sigue (MatLab):
Código:
function colin=colindantes(v) long=length(v); fig=zeros(1,long); temp=v; for j=1:long n=v(j); sumparcial=0; n1=n-11; n2=n-1; n3=n+11; n4=n-10; n5=n+10; n6=n-9; n7=n+1; n8=n+9; elem1=find(temp==n1, 1);elem2=find(temp==n2, 1);elem3=find(temp==n3, 1); elem4=find(temp==n4, 1);elem5=find(temp==n5, 1);elem6=find(temp==n6, 1); elem7=find(temp==n7, 1);elem8=find(temp==n8, 1); if ~isempty(elem1); sumparcial=sumparcial+1; temp(elem1)=-20; end %reemplazo por un -20, para que nunca se pueda encontrar dicha %componente de nuevo. if ~isempty(elem2); sumparcial=sumparcial+1; temp(elem2)=-20; end if ~isempty(elem3); sumparcial=sumparcial+1; temp(elem3)=-20; end if ~isempty(elem4); sumparcial=sumparcial+1; temp(elem4)=-20; end if ~isempty(elem5); sumparcial=sumparcial+1; temp(elem5)=-20; end if ~isempty(elem6); sumparcial=sumparcial+1; temp(elem6)=-20; end if ~isempty(elem7); sumparcial=sumparcial+1; temp(elem7)=-20; end if ~isempty(elem8); sumparcial=sumparcial+1; temp(elem8)=-20; end fig(j)=sumparcial; end colin=sum(fig); end
Luego me vi en la necesidad de crear un vector temporal para ir borrando los elementos a medida que se encontraban. En este caso, como no se puede borrar, los sustituyo por -20, así me aseguro que nunca se encontrará de nuevo (pues todos los elementos deben ser positivos).
Un saludo amigos, a ver quién me echa una mano!
Comentario