将三角矩阵映射到矢量

时间:2011-11-15 03:21:13

标签: matlab matrix

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索引,行主要语言)。

2 个答案:

答案 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