假设您有一个对称距离矩阵A
。例如A
是4*4
(矩阵上方和左侧的数字是测量距离的元素的索引,我们只使用下三角形):
0 1 2 3
_____________
0 |0 0 0 0
1 |a10 0 0 0
2 |a20 a21 0 0
3 |a30 a31 a32 0
所以,基本上,如果A
是n*n
,我们只有n*(n-1)/2
个有用的条目。消除对角线上的零,我们有以下矩阵(类似于Matlab和R所有):
A= 0 1 2
_________
1 |a10 0 0
2 |a20 a21 0
3 |a30 a31 a32
接下来,我们可以将这个矩阵有效地存储在具有np = n*(n-1)/2
元素的压缩格式的一维数组中:
Ap = {a10, a20, a21, a30, a31, a32}
这可以加速许多搜索(例如搜索最接近的元素对等)并节省大量空间(n
很大时很有用)
访问元素i
和j
之间的距离相当于访问压缩矩阵中的元素j+i(i-1)/2
,即A[i,j] = Ap[j+i(i-1)/2]
的{{1}}。
问题是,如果我们处于相反的情况,即我们在打包矩阵i>0, j<n-1, j<i
中有元素索引,我们如何恢复原始的两个索引:
给定Ap
,Ap[x]
中i
和j
的内容为A
。
谢谢!
答案 0 :(得分:0)
好的,我找到了答案:
i = floor{ (1 + sqrt[1 + 8*x])/2 }
j = x - i