将三角矩阵映射到矢量

rev*_*nge 2 matlab matrix

MATLAB函数pdist计算一组点的成对距离.为了节省空间和时间,它省略了repeat(dist(A,B) == dist(B,A))和self(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 -
Run Code Online (Sandbox Code Playgroud)

给定一个向量,例如,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
Run Code Online (Sandbox Code Playgroud)

如上所述,我有第一部分,找到第一个下标.我不太清楚第二个.有许多相关问题(见下文),但答案不正确(或特定于0索引,行主要语言).

k10*_*107 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;
Run Code Online (Sandbox Code Playgroud)

这导致了

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
Run Code Online (Sandbox Code Playgroud)