我会处理您的原始代码。首先,您要计算 所有 点的范数,并将它们作为单个元素存储在数组中。您当前的代码没有这样做,而是覆盖了变量 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 循环的功能完全一样。然而,这(至少对我而言)更具可读性,我敢说对于更大尺寸的点来说更快。