2009-11-09 21 views
8

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

7

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:

alt text

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.

+0

funcionó muy bien gracias! –

+1

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

8

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) 

screenshot

+0

+1: Very nice! No me di cuenta de que NCHOOSEK podía usarse de esa manera. – gnovice

+1

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

+0

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

Cuestiones relacionadas