有没有一种有效的方法来测量从单个点到大量点中每个点的距离?

时间:2019-04-05 00:39:54

标签: 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) & 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 :(得分:0)

速度下降可能是由于循环和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);