Оператор хеша в Matlab для линейных индексов векторов - PullRequest
1 голос
/ 19 февраля 2012

Я группирую большой набор точек.На протяжении всех итераций я хочу избежать повторного вычисления свойств кластера, если назначенные точки совпадают с предыдущей итерацией.Каждый кластер хранит идентификаторы своих точек.Я не хочу сравнивать их поэлементно, сравнивая сумму вектора идентификаторов рискованно (маленький идентификатор можно компенсировать большим), может мне стоит сравнить сумму квадратов?Есть ли в Matlab метод хеширования, который я могу использовать с уверенностью?

Пример данных:

a=[2,13,14,18,19,21,23,24,25,27]

b=[6,79,82,85,89,111,113,123,127,129]

c=[3,9,59,91,99,101,110,119,120,682]

d=[11,57,74,83,86,90,92,102,103,104]

Итак, проблема в том, что если я просто проверю сумму, это может быть кластер dнапример, теряет очки 11,103 и получает 9,105.Тогда я бы ошибочно подумал, что в кластере не произошло никаких изменений.

Ответы [ 3 ]

1 голос
/ 19 февраля 2012

Это одна из тех (очень распространенных) ситуаций, когда чем больше мы знаем о ваших данных и приложении, тем лучше мы можем помочь. В отсутствие более качественной информации, чем вы предоставляете, и в духе разоблачения слабости ответов, подобных этому, в это отсутствие, вот пара предложений, которые вы можете отклонить.

Одной подходящей структурой данных для операций над множествами является набор битов, который представляет собой набор длины, равный количеству элементов базового юниверса вещей, в котором каждый бит включен или выключен в соответствии с членством вещей -задавать). Вы можете реализовать это в Matlab как минимум двумя способами:

a) (легко, но, возможно, занимает слишком много места): определите матрицу с количеством столбцов, равным количеству точек в ваших данных, и одной строкой для каждого кластера. Установите для значения (cluster, point) значение true, если точка является членом кластера. Операции над множествами затем определяются векторными операциями. Я не имею понятия об относительной (временной) эффективности setdiff по сравнению с rowA == rowB.

b) (более сложный): фактически представляют кластеры с помощью наборов битов. Конечно, вам придется использовать возможности Matlab, но боль может стоить выигрыша. Предположим, что ваш юниверс состоит из 1024 точек, тогда вам понадобится массив из 16 значений uint64 для представления набора битов для каждого кластера. Наличие, скажем, точки 563 в кластере требует, чтобы для набора битов, представляющего этот кластер, был установлен бит 563 (который, вероятно, является битом 51 в 9-м элементе набора) равным 1.

И, возможно, мне следовало начать с написания, что я не думаю, что это проблема хеширования, это проблема определенного типа. Да, вы можете использовать хеш, но тогда вам придется программировать ограничения использования отвертки на гвозде (выберите предпочитаемую аналогию).

0 голосов
/ 23 февраля 2012

Я нашел функцию DataHash на FEX тихо быстро для векторов, а strcmp на клавишах намного быстрее, чем я ожидал.

0 голосов
/ 19 февраля 2012

Если я правильно понимаю, для хэширования идентификаторов я бы порекомендовал использовать интерфейс Java Matlab для использования алгоритмов хэширования Java

http://docs.oracle.com/javase/1.4.2/docs/api/java/security/MessageDigest.html

Вы сделаете что-то вроде:

hash = java.security.MessageDigest.getInstance('SHA');

Надеюсь, это поможет.

...