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

Я пишу код, который пытается раскрасить сложную плоскость, чтобы все точки на расстоянии 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) & 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 Ответ

0 голосов
/ 05 апреля 2019

Замедление возможно из-за цикла и оператора 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...