我要找到一组给定点与原点之间的最小距离。我有一个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, :);
我无法使用任何套餐。我在网上找到了几何包,但我没有额外的包来解决这个问题。
答案 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
循环的运行方式一样。然而,这(至少对我而言)更具可读性,而且对于更大尺寸的点,我敢更快。