找到原点的一组点中的最小距离

时间:2015-12-10 19:55:08

标签: octave distance

我要找到一组给定点与原点之间的最小距离。我有一个2列10行的矩阵。每行代表坐标。一个点由两个坐标组成,我想计算每个点和原点之间的最小距离。我还想确定哪个点给出了这个最小的距离。

在Octave中,我使用norm计算这个距离,对于我的集合中的每个点,我有一个与它们相关的距离,最小距离显然是我正在寻找的距离。但是,我在下面写的代码没有按照它应该的方式工作。

function [dist,koor] = bonus4(S)     
 S= [-6.8667,  -44.7967; 
    -38.0136, -35.5284; 
     14.4552, -27.1413; 
     8.4996,   31.7294; 
    -17.2183,  28.4815; 
    -37.5100,  14.1941; 
    -4.2664,  -24.4428; 
    -18.6655,  26.9427; 
    -15.8828,  18.0170; 
     17.8440, -22.9164]; 
    for i=1:size(S) 
        L=norm(S(i, :)) 

     dist=norm(S(9, :)); 
          koor=S(9, :) ; 
end

i = 9是正确的答案,但是我需要Octave来输入这个号码。我怎么告诉Octave这是我想要的号码?具体做法是:

 dist=norm(S(9, :));   
 koor=S(9, :);

我无法使用任何套餐。我在网上找到了几何包,但我没有额外的包来解决这个问题。

1 个答案:

答案 0 :(得分:1)

我将使用原始代码。首先,您要计算点的全部的范数,并将它们作为单个元素存储在数组中。您当前的代码没有这样做,并且正在覆盖变量L,它在循环的每次迭代中都是单个值。

您希望使L成为一个数组,并在循环的每次迭代中存储规范。完成此操作后,您将要查找位置以及最小距离。这可以通过对min的一次调用来完成,其中第一个输出为您提供最小距离,第二个输出为您提供最小值的位置。您可以使用第二个输出切入S数组以检索实际点。

最后但并非最不重要的是,在调用此函数之前,您需要先定义 S。您正在函数内部定义S,如果您想在每次调用时将输入更改为此函数,则可能会给您带来意想不到的结果。因此,首先定义S,然后调用函数:

 S= [-6.8667,  -44.7967; 
    -38.0136, -35.5284; 
     14.4552, -27.1413; 
     8.4996,   31.7294; 
    -17.2183,  28.4815; 
    -37.5100,  14.1941; 
    -4.2664,  -24.4428; 
    -18.6655,  26.9427; 
    -15.8828,  18.0170; 
     17.8440, -22.9164];

function [dist,koor] = bonus4(S)             
    %// New - Create an array to store the distances
    L = zeros(size(S,1), 1);

    %// Change to iterate over number of rows
    for i=1:size(S,1) 
        L(i)=norm(S(i, :)); %// Change
    end

    [dist,ind] = min(L); %// Find the minimum distance
    koor = S(ind,:); %// Get the actual point
end

或者,确保将上述函数保存在名为bonus4.m的文件中,然后在Octave命令提示符下执行此操作:

octave:1> S= [-6.8667,  -44.7967; 
>         -38.0136, -35.5284; 
>          14.4552, -27.1413; 
>          8.4996,   31.7294; 
>         -17.2183,  28.4815; 
>         -37.5100,  14.1941; 
>         -4.2664,  -24.4428; 
>         -18.6655,  26.9427; 
>         -15.8828,  18.0170; 
>          17.8440, -22.9164];
octave:2> [dist,koor] = bonus4(S);

虽然这段代码有效,但我会辩论,当你使用for循环时它很慢。更快的方法是完全矢量化。因为对于矩阵使用norm与使用向量不同,所以您必须自己计算距离。因为您要测量距离原点的距离,所以您可以单独对每个列进行平方,然后添加每行的列。

因此,您可以这样做:

S= [-6.8667,  -44.7967; 
    -38.0136, -35.5284; 
     14.4552, -27.1413; 
     8.4996,   31.7294; 
    -17.2183,  28.4815; 
    -37.5100,  14.1941; 
    -4.2664,  -24.4428; 
    -18.6655,  26.9427; 
    -15.8828,  18.0170; 
     17.8440, -22.9164]; 

function [dist,koor] = bonus4(S)     
    %// New - Computes the norm of each point
    L = sqrt(sum(S.^2, 2));

    [dist,ind] = min(L); %// Find the minimum distance
    koor = S(ind,:); %// Get the actual point

end

函数sum可用于独立地对维度求和。因此,通过执行S.^2,您将在点矩阵中对每个项进行平方,然后使用sum将第二个参数作为2,您将对每个项的所有列进行求和行。取这个结果的平方根计算每个点到原点的距离,就像for循环的运行方式一样。然而,这(至少对我而言)更具可读性,而且对于更大尺寸的点,我敢更快。

相关问题