使用MATLAB查找矩阵中两行的最大/最小距离

时间:2014-08-12 01:35:11

标签: matlab math euclidean-distance

假设我们有一个矩阵m x n,其中矩阵的行数非常大。如果我们假设每一行都是一个向量,那么如何找到该矩阵中向量之间的最大/最小距离?

2 个答案:

答案 0 :(得分:2)

我的建议是使用pdist。这计算了@seb建议的独特观测组合之间的欧几里德距离对,但这已经内置在MATLAB中。您的矩阵已经很好地格式化为pdist,其中每一行都是一个观察点,每一列都是一个变量。

申请pdist后,请应用squareform,以便以更愉快的矩阵形式显示成对条目之间的距离。此矩阵中每个值的(i,j)条目告诉您i th 和j th 行之间的距离。还要注意,该矩阵将是对称的,并且沿对角线的距离将不可避免地等于0,因为任何向量与其自身的距离必须为零。如果两个不同向量之间的最小距离为零,如果我们要搜索此矩阵,那么它可能会报告自身距离而不是两个不同向量之间的实际距离。因此,在此矩阵中,您应该将此矩阵的对角线设置为NaN,以避免输出这些矩阵。

因此,假设你的矩阵是A,你所要做的就是:

distValues = pdist(A); %// Compute pairwise distances
minDist = min(distValues); %// Find minimum distance
maxDist = max(distValues); %// Find maximum distance
distMatrix = squareform(distValues); %// Prettify
distMatrix(logical(eye(size(distMatrix)))) = NaN; %// Ignore self-distances
[minI,minJ] = find(distMatrix == minDist, 1); %// Find the two vectors with min. distance
[maxI,maxJ] = find(distMatrix == maxDist, 1); %// Find the two vectors with max. distance

minI, minJ, maxI, maxJ将返回分别产生最小距离和最大距离的两行A。请注意,使用find语句,我已将第二个参数设置为1,以便它只返回一对向量,这对向量之间具有此最小/最大距离。但是,如果省略此参数,则它将返回共享相同距离的所有可能行,但由于squareform是对称的,因此您将获得重复的条目。如果要避开重复,请将squareform矩阵的上三角半部分或下三角半部分设置为NaN,以告诉MATLAB跳过在这些重复区域中的搜索。您可以使用MATLAB的triltriu命令来执行此操作。请注意,默认情况下,这些方法中的任何一个都将包含矩阵的对角线,因此这里不会有任何额外的工作。因此,尝试类似:

distValues = pdist(A); %// Compute pairwise distances
minDist = min(distValues); %// Find minimum distance
maxDist = max(distValues); %// Find maximum distance
distMatrix = squareform(distValues); %// Prettify
distMatrix(triu(true(size(distMatrix)))) = NaN; %// To avoid searching for duplicates
[minI,minJ] = find(distMatrix == minDist); %// Find pairs of vectors with min. distance
[maxI,maxJ] = find(distMatrix == maxDist); %// Find pairs of vectors with max. distance

从你的申请来看,你只是想找到一个这样的事件,所以让我们把它留在那里,但我会把它放在这里给你,以备不时之需。

答案 1 :(得分:1)

你的意思是任何2行之间的最大/最小距离?如果是这样,你可以尝试:

numRows = 6;
A = randn(numRows, 100);      %// Example of input matrix


%// Compute distances between each combination of 2 rows
T = nchoosek(1:numRows,2);  %// pairs of indexes for all combinations of 2 rows
for k=1:length(T)
    d(k) = norm(A(T(k,1),:)-A(T(k,2),:));
end

%// Find min/max distance
[~, minIndex] = min(d);
[~, maxIndex] = max(d);

T(minIndex,:)   %// Displays indexes of the 2 rows with minimum distance
T(maxIndex,:)   %// Displays indexes of the 2 rows with maximum distance