繁体   English   中英

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

[英]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的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

从你的应用程序来看,你只想找到一个这样的事件,所以让我们把它留在那里,但我会把它放在这里给你,以防你需要它。

你的意思是任何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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM