Существует ли эффективный способ измерить расстояние от одной точки до каждой точки в большом массиве точек?

#matlab

#matlab

Вопрос:

Я пишу код, который пытается раскрасить комплексную плоскость так, чтобы все точки на расстоянии ровно 1 единицы от них были разного цвета. Сравнение расстояния между большим количеством точек занимает слишком много времени для моего кода.

То, что я пытался делать до сих пор, — это создать точку в начале координат, затем она создает единственную точку на единичном круге, окрашивает ее по-разному, а затем переходит к следующей точке на единичном круге. Мой код сравнивает каждую точку с любой другой созданной точкой, проверяя расстояние между ними, чтобы увидеть, равно ли оно 1, и если да, то сравнивает цвет, чтобы убедиться, что они разные. Мой код работает для небольшого количества точек, но становится очень медленным по мере роста количества точек (поскольку после завершения единичного круга вокруг начала координат я создаю единичный круг вокруг каждой точки, которую я только что создал, и так далее). Как можно сократить количество производимых мной сравнений?

 p=[p;p(m,1) exp(1i*j*h),1]; % the list of points already created
l=length(p)-1; % the length for my for loop
toss=[]; % creates storage of colors already used
   for k1=1:l % checks every point previously created
       % if statement checks the distance between two point
       if abs(p(end,1)-p(k1,1))>(1-tol) amp; abs(p(end,1)-p(k1,1))<(1 tol)
           toss=[toss,p(k1,2)]; % adds the color of any point in a unit step
       end
   end
colornum=[1,2,3,4,5,6]; % defines colors as number
toss=unique(toss); % condenses all the colors already used
Arr3 = setxor(colornum,toss); %creates a vector of unused colors
p(end,2)=Arr3(1); % assigns the first available color
  

Я хотел бы, чтобы на выходе была большая матрица, в первом столбце которой была позиция в комплексной плоскости, а во втором столбце было число, соответствующее цвету

Ответ №1:

Замедление, вероятно, связано с циклом и инструкцией if.

Попробуйте векторизовать это :

 point_to_compare = p(end,1);
vec_to_compare = p(1:end-1,1);
points_to_add = [abs(abs(vec_to_compare - point_to_compare)-1)<tol; false];
toss = p(points_to_add,2);
  

Комментарии:

1. Это работает значительно быстрее! Примечание стороны, если кто-либо читает решение и заинтересован, vec_to_compare необходимо перенести для сравнения. Спасибо за решение!

2. Отлично! Я исправил векторные размеры.