MATLAB函数pdist
计算一组点的成对距离。为了节省空间和时间,重复(dist(A,B) == dist(B,A)
)和自我(dist(A,A) == 0
)比较。结果在单个向量中返回,索引为[1 2 3 4 5 6 7 8 9 10]
。扩展为全距离矩阵(例如,通过函数squareform
),位置映射如下:
- - - - -
1 - - - - # "1" is subscript "1,2"
2 5 - - -
3 6 8 - - # "6" is subscript "4,2"
4 7 9 10 -
给定一个由pdist
生成的向量,将索引转换为该向量的表达式到全距离矩阵的下标索引是什么?
例如,我希望在一系列观点中找到彼此距离最远的两个点:
d = pdist(points); %# points is M x 2 (or 3, etc.), d is described above
N = length(d);
[~,I] = max(d); %# I is the index, e.g. 6
CI = ceil( sqrt( 2*N ) ) - round( sqrt( 2*(1 + N - I) ) ); %# Identity of one point, e.g. 4 is I == 6
RI = ???? %# Identity of second point, e.g. 2, if I == 6 and CI == 4
如上所述,我有第一部分,找到第一个下标。我不太清楚第二个。有许多相关问题( vide infra ),但答案不正确(或特定于0索引,行主要语言)。
答案 0 :(得分:5)
@reve_etrange我认为N应该是d的长度,而不是你的点矩阵的行数。
K=5; % Number of points
d = pdist(rand(K,3));
N = length(d);
m = ceil(sqrt(2*N));
I = 1:N;
CI = m - round( sqrt( 2*(1 + N - I) ) );
RI = mod(I + CI.*(CI+1)/2 - 1, m) + 1;
这导致
I = 1 2 3 4 5 6 7 8 9 10
RI = 2 3 4 5 3 4 5 4 5 5
CI = 1 1 1 1 2 2 2 3 3 4
答案 1 :(得分:0)
问题的某些部分仍然是无稽之谈,但我相信这是你要做的......
找到与距离矩阵大小相同的下三角矩阵的非零元素的下标:
>> points = randn(5,2);
>> [i,j] = find(tril(ones(size(points, 1)), -1))
i =
2
3
4
5
3
4
5
4
5
5
j =
1
1
1
1
2
2
2
3
3
4