I tienen un vector que contiene algunos puntos en el espacio 2-D. Quiero que MATLAB trace estos puntos con líneas dibujadas desde cada punto hasta cualquier otro punto. Básicamente, quiero un gráfico con todos los vértices conectados. ¿Puedes hacer eso con la trama? Si es así, ¿cómo?¿Cómo trazo líneas entre todos los puntos en un vector?
Respuesta
Una solución es crear un conjunto de índices para cada combinación de puntos usando la función MESHGRID. A continuación, puede trazar cada línea usando la función LINE (que traza una línea por cada columna de datos que se le da):
N = 10; %# Number of points
x = rand(1,N); %# A set of random x values
y = rand(1,N); %# A set of random y values
[I,J] = meshgrid(1:N); %# Create all the combinations of indices
index = [I(:) J(:)].'; %'# Reshape the indices
line(x(index),y(index),'Color','k'); %# Plot the lines
hold on
plot(x,y,'r*'); %# Plot the points
EDIT:
puede observar que la solución anterior trazará una línea de cada de conexión, lo que significa que será trazar líneas de longitud cero que unen puntos a sí mismos y trazará 2 líneas para cada conexión (es decir, desde el punto a al B y punto desde el punto B al punto a). Aquí hay otra solución (utilizando las funciones HANKEL y FIND) que no trazar las líneas redundantes o innecesarios:
N = 10; %# Number of points
x = rand(1,N); %# A set of random x values
y = rand(1,N); %# A set of random y values
[r,c,v] = find(hankel(2:N)); %# Create unique combinations of indices
index = [v c].'; %'# Reshape the indices
line(x(index),y(index),'Color','k'); %# Plot the lines
hold on
plot(x,y,'r*'); %# Plot the points
Tanto de las soluciones anteriores crean parcelas visualmente idénticos:
A nota sobre el tiempo ...
Por curiosidad, pensé que tendría tiempo mi HANKEL solución y comparar con Amro's solución muy escueta NCHOOSEK. Para N = 10
, no hubo una diferencia apreciable. Sin embargo, como he aumentado N
a valores mucho más grandes empecé a ver el comienzo solución NCHOOSEK para convertirse muy lento:
N = 200
>> tic; [r,c,v] = find(hankel(2:N)); index = [v c].'; toc; %' Elapsed time is 0.009747 seconds. >> tic; pairs = nchoosek(1:N,2).'; toc; %' Elapsed time is 0.063982 seconds.
N = 1000
>> tic; [r,c,v] = find(hankel(2:N)); index = [v c].'; toc; %' Elapsed time is 0.175601 seconds. >> tic; pairs = nchoosek(1:N,2).'; toc; %' Elapsed time is 12.523955 seconds.
me sorprendió bastante, hasta que miré el código para NCHOOSEK (escribiendo type nchoosek
en la ventana de comandos de MATLAB). No sólo es una variable que se está crecido dentro de un bucle en lugar de ser preallocated (como Amro señaló en un comentario), pero el algoritmo utilizado es también recursiva, lo que significa que se hacen muchas llamadas a funciones. También noté esta línea al final del texto de ayuda para NCHOOSEK:
Esta sintaxis es solo práctica para situaciones donde N es menor que 15.
Sobre la base de ejemplo gnovice 's, una forma más intuitiva más simple de generar todos los pares está utilizando la función nchoosek:
%# random points
N = 10;
x = rand(1,N);
y = rand(1,N);
%# all possible combinations of the elements of [1:N] taken 2 at a time
pairs = nchoosek(1:N, 2)';
%'# plot points and lines
plot(x(pairs), y(pairs), '-bs', 'MarkerFaceColor','g', 'MarkerSize',10)
+1: Very nice! No me di cuenta de que NCHOOSEK podía usarse de esa manera. – gnovice
Recuerdo haberlo leído en esta excelente publicación del blog "Introducción a Combinatorics": http://blinkdagger.com/matlab/matlab-a-introduction-to-combinatorics/ – Amro
Por curiosidad, hice algún tiempo de nuestras soluciones para las más grandes 'N'. Lo agregué a mi respuesta y me sorprendieron los resultados. ¿Notan lo mismo? – gnovice
- 1. R stat_smooth todos los puntos
- 2. Reemplazar todos los puntos en un número
- 3. MapKit - polylineWithCoordinates interconecta todos los puntos
- 4. Matlab: cómo reemplazar todos los caracteres especiales en un vector?
- 5. ordenar un vector de puntos basado en otro vector
- 6. Algoritmo: ruta más corta entre todos los puntos
- 7. ¿Cómo encuentro todos los puntos en una ruta en Android?
- 8. ¿Diferencia entre trazo y relleno?
- 9. ¿Está bien usar constructores para inicializar un vector 2D como un trazo en C++?
- 10. Emacs líneas truncadas en todos los buffers
- 11. Ruby Rails Postgis - Encontrar todos los puntos en un polígono
- 12. Dibujando un camino entre dos puntos
- 13. Cómo deshabilitar todos los puntos de interrupción en Xcode
- 14. Xcode + eliminar todos los puntos de interrupción
- 15. usando STL para encontrar todos los elementos de un vector
- 16. ¿Cómo hago un trazo en el iPhone?
- 17. une todos los puntos (posible conbination) en gráfico de dispersión
- 18. Dado un conjunto de puntos, ¿cómo encuentro los dos puntos que están más alejados entre sí?
- 19. ¿Cómo elimino todos los puntos críticos de Firebug JS?
- 20. Dibuja líneas desde el eje x a los puntos
- 21. Obtener todos los puntos dentro de cierto radio en Django
- 22. Eliminar todos los espacios en blanco y las líneas vacías
- 23. ¿Cómo eliminar todos los puntos de interrupción en un solo paso en Google Chrome?
- 24. Todos los puntos y valor undefined en gnuplot
- 25. Regex para spliting en todos los puntos y comas
- 26. Ver todos los puntos de interrupción en Visual Studio 2010+
- 27. ¿Cómo agregar todos los elementos de una matriz String a un vector en Java?
- 28. Dibuja líneas de puntos usando Quartz en iPhone
- 29. ¿Cómo se configuran automáticamente los puntos de interrupción en todos los métodos en XCode?
- 30. En PostGIS, ¿cómo puedo encontrar todos los puntos dentro de un polígono?
funcionó muy bien gracias! –
Incluso podría agregar la prueba: 'N = 1000; pares = ceros (2,499500); k = 0; para i = 1: N, para j = i + 1: N, k = k + 1; pares (:, k) = [j; i]; end, end' para mostrar la diferencia con la versión no vectorizada (la solución HANKEL es aún más rápida) – Amro