假设我有一个矩阵A
,这是一个n * 3矩阵,列出了n个点的笛卡尔坐标。我感兴趣的是找到northPole和southPole,它们基本上是两个坐标,最大距离。我希望northPole和southPole分别具有最小和最大z坐标,我想使用x和y坐标来打破关系。这个问题很容易使用循环,但我想让我的代码有效,因为矩阵A真的很大。所以我需要帮助找到使用内置MatLab函数的northPole和southPole,以便代码高效。谢谢!
答案 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, :);
尝试使用file exchange.中的distmat
函数N x D
点数A
,其中N
是点数,{ {1}}是维度,并返回D
距离数组N x N
,其中dist
是dist(i, j)
和A(i,:)
之间的距离。 A(j,:)
有4种不同的算法可用于生成矩阵,具体取决于哪种算法可以提供最佳性能。
您可以使用此功能创建距离矩阵,然后使用distmat
找到最大距离的候选者。然后你可以用自己喜欢的方式打破关系。
在以下功能中,我找到了相距最大距离的所有点。如果有多对,那么我会根据候选人之间的x-y距离打破关系。
max
此解决方案还使用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