Как построить линии между всеми точками в векторе? - PullRequest
8 голосов
/ 09 ноября 2009

У меня есть вектор, содержащий несколько точек в двухмерном пространстве. Я хочу, чтобы MATLAB построил эти точки с помощью линий, проведенных из каждой точки в любую другую. По сути, я хочу граф со всеми связанными вершинами. Вы можете сделать это с помощью сюжета, и если да, то как?

Ответы [ 2 ]

8 голосов
/ 09 ноября 2009

Основываясь на примере gnovice , более простой и интуитивно понятный способ генерации всех пар - использование функции 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

8 голосов
/ 09 ноября 2009

Одним из решений является создание набора индексов для каждой комбинации точек с использованием функции MESHGRID . Затем вы можете построить каждую линию с помощью функции LINE (которая отображает одну строку на столбец данных, которые ей даны):

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:

Вы можете заметить, что вышеприведенное решение построит линию для каждого соединения, что означает, что оно построит линии нулевой длины, соединяющих точки с собой, и построит 2 линии для каждого соединения (то есть из точки A в точку B и из точки B в точку A). Вот еще одно решение (с использованием функций HANKEL и FIND ), которое не будет отображать лишние или ненужные линии:

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

Оба вышеуказанных решения создают визуально идентичные графики:

alt text

Примечание о времени ...

Из любопытства я подумал, что я выберу время для своего HANKEL решения и сравню его с Amro очень кратким NCHOOSEK . Для N = 10 заметной разницы не было. Однако, когда я увеличил N до гораздо больших значений, я начал видеть, что решение NCHOOSEK начинает становиться очень медленным:

  • 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.
    

Я был немного удивлен, пока не посмотрел код для NCHOOSEK (набрав type nchoosek в командном окне MATLAB). Мало того, что переменная растет внутри цикла вместо того, чтобы быть предварительно выделенной (как отметил Амро в комментарии), но используемый алгоритм также рекурсивный , что означает, что многие вызовы функций сделал. Я также заметил эту строку в конце текста справки для NCHOOSEK:

Этот синтаксис полезен только для ситуаций, когда N меньше, чем 15.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...