1

У меня есть многомерные точки, которые могут иметь ключи следующих трех типов INT (4), то есть Short или INT (8) или varchar (512).Compact Hilbert Code by Chris Hamilton - рассчитать индексы Compact Hilbert

По этой причине я не могу использовать нормальное преобразование кривой Гильберта. Я нашел очень хороший ресурс для вычисления компактных индексов гильберта. Ссылка здесь.

http://web.cs.dal.ca/~chamilto/hilbert/index.html

Я понимаю, точки и мотивации в своей работе, но я не могу расшифровать код. Я не могу понять, какие функции вызывать для вычисления индексов Компактных Гильбертов и их обратного.

+0

Итак, вы спрашиваете нас, как работает код? Почему бы не связаться с автором? – Bart

+1

C++ не имеет типов 'INT (4)', 'INT (8)' или 'varchar (512)'. Это больше похоже на Fortran. Вы уверены, что правильно отметили этот вопрос? –

+0

@ DietmarKühl iirc, это типы SQL, которые легко соответствуют int32_t, int64_t и char [512] или std :: string - сама библиотека, по-видимому, написана на C++, поэтому тегирование, вероятно, нормально. – kfmfe04

ответ

1

http://code.google.com/p/uzaygezen/ является открытым исходным кодом реализации Java из Компактный индекс Гильберта. Ниже приведен пример, соответствующий 3 измерениям с 4, 8 и 512 байтами, как указано в вопросе:

CompactHilbertCurve chc = new CompactHilbertCurve(new int[] {4 * 8, 8 * 8, 512 * 8}); 
List<Integer> bitsPerDimension = chc.getSpec().getBitsPerDimension(); 
BitVector[] p = new BitVector[bitsPerDimension.size()]; 
for (int i = p.length; --i >= 0;) { 
    p[i] = BitVectorFactories.OPTIMAL.apply(bitsPerDimension.get(i)); 
} 
p[0].copyFrom(123); 
p[1].copyFrom(32342); 
p[2].copyFrom(BitSet.valueOf("test".getBytes("ISO-8859-1"))); 
BitVector chi = BitVectorFactories.OPTIMAL.apply(chc.getSpec().sumBitsPerDimension()); 
chc.index(p, 0, chi); 
System.out.println(chi); 
0

Если вы скачиваете код и посмотреть на файл заголовка, оно должно быть само за себя (кстати, Либерал построен хорошо для меня на Ubuntu):

// Description of parameters: 
// 
// FOR REGULAR HILBERT INDICES 
// 
// CFixBitVec/CBigBitVec *p 
// Pointer to array of non-negative coordinate values. 
// 
// int m 
// Precision of all coordinate values (number of bits required to 
// represent the largest possible coordinate value). 
// 
// int n 
// Number of dimensions (size of the array *p). 
// 
// CFixBitVec/CBigBitVec &h 
// Hilbert index of maximum precision m*n. 
// 
// int *ms 
// Array of precision values, one per dimension. 
// 
// FOR COMPACT HILBERT INDICES 
// 
// CFixBitVec/CBigBitVec &hc 
// Compact Hilbert index of maximum precision M. 
// 
// int M 
// Net precision value, corresponding to the size of the compact 
// Hilbert code. If not provided, defaults to zero and will be calculated 
// by the function (sum_i { ms[i] }). 
// 
// int m 
// Largest precision value (max_i { ms[i] }). If not provided, defaults 
// to zero and will be calculated by the function, 


namespace Hilbert 
{ 
    // fix -> fix 
    void coordsToIndex(const CFixBitVec *p, int m, int n, CFixBitVec &h); 
    void indexToCoords(CFixBitVec *p, int m, int n, const CFixBitVec &h); 
    void coordsToCompactIndex(const CFixBitVec *p, const int *ms, int n, 
     CFixBitVec &hc, int M = 0, int m = 0); 
    void compactIndexToCoords(CFixBitVec *p, const int *ms, int n, 
     const CFixBitVec &hc, int M = 0, int m = 0); 

    // fix -> big 
    void coordsToIndex(const CFixBitVec *p, int m, int n, CBigBitVec &h); 
    void indexToCoords(CFixBitVec *p, int m, int n, const CBigBitVec &h); 
    void coordsToCompactIndex(const CFixBitVec *p, const int *ms, int n, 
     CBigBitVec &hc, int M = 0, int m = 0); 
    void compactIndexToCoords(CFixBitVec *p, const int *ms, int n, 
     const CBigBitVec &hc, int M = 0, int m = 0); 

    // big -> big 
    void coordsToIndex(const CBigBitVec *p, int m, int n, CBigBitVec &h); 
    void indexToCoords(CBigBitVec *p, int m, int n, const CBigBitVec &h); 
    void coordsToCompactIndex(const CBigBitVec *p, const int *ms, int n, 
     CBigBitVec &hc, int M = 0, int m = 0); 
    void compactIndexToCoords(CBigBitVec *p, const int *ms, int n, 
     const CBigBitVec &hc, int M = 0, int m = 0); 
}; 
+0

Спасибо за любезное приглашение, если вы заметили в главном коде теста, автор создает точку 4 измерения, и это преобразование просто ОК. Однако при попытке масштабирования этого кода до 5 измерений он начинает давать ответы на мусор. Попробовали? – Basmah

+0

Прочтите авторскую документацию - возможно, в его реализации есть ограничения: я понятия не имею. – kfmfe04

+0

Нет авторской документации; вот почему мы не знаем, как его использовать. – Basmah