使用MatLab查找最大距离

时间:2013-05-30 15:16:22

标签: matlab function

假设我有一个矩阵A,这是一个n * 3矩阵,列出了n个点的笛卡尔坐标。我感兴趣的是找到northPole和southPole,它们基本上是两个坐标,最大距离。我希望northPole和southPole分别具有最小和最大z坐标,我想使用x和y坐标来打破关系。这个问题很容易使用循环,但我想让我的代码有效,因为矩阵A真的很大。所以我需要帮助找到使用内置MatLab函数的northPole和southPole,以便代码高效。谢谢!

2 个答案:

答案 0 :(得分:0)

您自己描述了答案:首先找到最小或最大Z值的索引,然后使用最小的X& Y距离打破关系。

zmax = max(A(:,3));
zmaxNdx = find(zmax == A(:,3));
d2 = A(zmaxNdx,1).^2 + A(zmaxNdx,2).^2;
[~, d2minNdx] = min(d2);
northpoleNdx = zmaxNdx(d2minNdx)

zmin = min(A(:,3));
zminNdx = find(zmin == A(:,3));
d2 = A(zminNdx,1).^2 + A(zminNdx,2).^2;
[~, d2minNdx] = min(d2);
southpoleNdx = zminNdx(d2minNdx)

答案 1 :(得分:0)

您建议的算法实际上不会找到最大距离的两个坐标。例如,如果最大距离的两个点有z = 0怎么办?

这里有两个解决方案,一个实际上会给你两个相距最大距离的点,另一个是你的northPole-southPole算法的实现。请注意,在两个解决方案中,我给出的函数返回候选点的索引,而不是点本身。你可以通过

获得积分
north = A(iN, :);
south = A(iS, :);

解决方案1:找到最大距离

的两个点

尝试使用file exchange.中的distmat函数N x D点数A,其中N是点数,{ {1}}是维度,并返回D距离数组N x N,其中distdist(i, j)A(i,:)之间的距离。 A(j,:)有4种不同的算法可用于生成矩阵,具体取决于哪种算法可以提供最佳性能。

您可以使用此功能创建距离矩阵,然后使用distmat找到最大距离的候选者。然后你可以用自己喜欢的方式打破关系。

在以下功能中,我找到了相距最大距离的所有点。如果有多对,那么我会根据候选人之间的x-y距离打破关系。

max

解决方案2:找到“北极”和“南极”

此解决方案还使用function [iN, iS] = poles(A) % create the distance matrix dist = distmat(A); % find all candidate pairs of north and south poles [~, iMax] = max(dist(:)); [iN, iS] = ind2sub(size(dist), iMax); % If there is only one, you are done, otherwise break the ties. if length(iMax) == 1 return end % % break ties by the euclidean distance of the x-y coordinates % note that this may not result in a unique set of north and south poles, % but you can always break further ties. north = A(iN, 1:2); south = A(iS, 1:2); tieBreak = sum(abs(north-south).^2, 2); [~, iMax] = max(tieBreak); iN = iN(iMax); iS = iS(iMax); end 函数。首先,它找到具有最大和最小z值的点。如果没有关系,那就停止了。否则,它会找到具有最大距离的“北”和“南”点,以及如上所述的平局。

distmat