2013-08-25 3 views
0

Предположим, что у вас есть симметричная матрица расстояний 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] для i>0, j<n-1, j<i.

Вопрос заключается в том, если мы находимся в противоположной ситуации, то есть у нас есть индекс элемента в упакованной матрице Ap, как мы восстановить исходные два индекс: Учитывая Ap[x], какова i и j в A, такие это Ap[x] = A[i,j].

Спасибо!

ответ

0

ОК, я нашел ответ:

i = floor{ (1 + sqrt[1 + 8*x])/2 } 
j = x - i