Существует ли преимущество для не наличия внешних ключей? Если Вы не используете дрянную базу данных, FKs не это трудно для установки. Итак, почему у Вас была бы политика предотвращения их? Это - одна вещь иметь соглашение о присвоении имен, в котором говорится столбец ссылки другой, это - другой, чтобы знать, что база данных на самом деле проверяет что отношения для Вас.
Одно из решений - создать набор индексов для каждой комбинации точек с помощью функции 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
Оба вышеупомянутых решения создают визуально идентичные графики:
Замечание о сроках ...
Из любопытства, я решил, что примечателен для своего решения 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
Оба вышеперечисленных решения создают визуально идентичные графики:
Примечание о времени ...
Из любопытства я подумал, что я могу рассчитать свое решение 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
Оба вышеперечисленных решения создают визуально идентичные графики:
Примечание о времени ...
Из любопытства я подумал, что мне нужно измерить время своего 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.
Основываясь на примере 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)