[英]Finding maximum/minimum distance of two rows in a matrix using MATLAB
假设我们有一个矩阵mxn
,其中矩阵的行数非常大。 如果我们假设每一行都是一个向量,那么如何找到该矩阵中向量之间的最大/最小距离?
我的建议是使用pdist
。 这计算了@seb建议的独特观测组合之间的欧几里德距离对,但这已经内置在MATLAB中。 你的矩阵已经很好地格式化为pdist
,其中每一行都是一个观察,每一列都是一个变量。
一旦你申请pdist
,适用squareform
这样就可以在一个更舒适的矩阵形式成对显示条目之间的距离。 此矩阵中每个值的(i,j)
条目告诉您第 i行和第 j行之间的距离。 另请注意,此矩阵将是对称的,沿对角线的距离将不可避免地等于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
从你的应用程序来看,你只想找到一个这样的事件,所以让我们把它留在那里,但我会把它放在这里给你,以防你需要它。
你的意思是任何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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.