Как делают меня сюжетные линии между всеми точками в векторе?

Существует ли преимущество для не наличия внешних ключей? Если Вы не используете дрянную базу данных, FKs не это трудно для установки. Итак, почему у Вас была бы политика предотвращения их? Это - одна вещь иметь соглашение о присвоении имен, в котором говорится столбец ссылки другой, это - другой, чтобы знать, что база данных на самом деле проверяет что отношения для Вас.

8
задан Franck Dernoncourt 15 August 2012 в 20:20
поделиться

2 ответа

Одно из решений - создать набор индексов для каждой комбинации точек с помощью функции 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 ). Вот' s другое решение (с использованием функций 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 и сравню его с очень кратким NCHOOSEK решением Amro . Для N = 10 заметной разницы не было. Однако, когда я увеличил N до гораздо больших значений, я начал видеть, что решение NCHOOSEK начало становиться очень медленным:

  • N = 200

     >> тик; [r, c, v] = найти (hankel (2: N)); index = [vc]. '; toc; % ' 

    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 и сравнить его с Очень краткое NCHOOSEK решение Амро. Для N = 10 заметной разницы не было. Однако, когда я увеличил N до гораздо больших значений, я начал видеть, что решение NCHOOSEK начало становиться очень медленным:

    • N = 200

       >> tic; [r, c, v] = найти (hankel (2: N)); index = [vc]. '; toc; % ' 

      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 решения и сравнить его с Очень краткое NCHOOSEK решение Амро. Для N = 10 заметной разницы не было. Однако, когда я увеличил N до гораздо больших значений, я начал видеть, что решение NCHOOSEK начало становиться очень медленным:

      • N = 200

         >> тик; [r, c, v] = найти (hankel (2: N)); index = [vc]. '; toc; % ' заметной разницы не было. Однако, когда я увеличил  N  до гораздо больших значений, я начал видеть, что решение NCHOOSEK начало становиться  очень  медленным: 

        • N = 200

           >> тик; [r, c, v] = найти (hankel (2: N)); index = [vc]. '; toc; % ' заметной разницы не было. Однако, когда я увеличил  N  до гораздо больших значений, я начал видеть, что решение NCHOOSEK начало становиться  очень  медленным: 

          • N = 200

             >> tic; [r, c, v] = найти (hankel (2: N)); index = [vc]. '; toc; % '
            Истекшее время составляет 0,009747 секунды.
            
            >> тик; пары = nchoosek (1: N, 2). '; toc; % '
            Истекшее время 0,063982 секунды.
            
          • N = 1000

             >> тик; [r, c, v] = найти (hankel (2: N)); index = [vc]. '; toc; % '
            Истекшее время 0,175601 секунды.
            
            >> тик; пары = nchoosek (1: N, 2). '; toc; % '
            Истекшее время - 12,523955 секунд.
            

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

          Этот синтаксис применим только в ситуациях, когда N меньше примерно 15.

8
ответ дан 5 December 2019 в 10:42
поделиться

Основываясь на примере 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
ответ дан 5 December 2019 в 10:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: