假设我们有一个矩阵m x n
,其中矩阵的行数非常大。如果我们假设每一行都是一个向量,那么如何找到该矩阵中向量之间的最大/最小距离?
答案 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的tril
或triu
命令来执行此操作。请注意,默认情况下,这些方法中的任何一个都将包含矩阵的对角线,因此这里不会有任何额外的工作。因此,尝试类似:
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