Как я могу сгенерировать ключ карты для этого вектора в MATLAB? - PullRequest
5 голосов
/ 19 июля 2011

У меня есть функция, которая смотрит на несколько элементов. Каждый элемент имеет форму вектора столбца 8x1. Каждая запись в векторе является целым числом, меньшим 1000. Каждый раз, когда я вижу такой вектор, я бы хотел добавить его в список «уже увиденных» векторов, проверив, что вектора еще нет в этом списке. , Функция будет проверять порядка ~ 100 000 таких векторов.

Первоначально я пытался использовать ismember(v', M, 'rows'), но обнаружил, что это очень медленно. Далее я попробовал:

found = containers.Map('KeyType', 'double', 'ValueType', 'any');

Затем каждый раз, когда я проверяю новый вектор v, вычисляем:

key = dot(v, [1000000000000000000000 1000000000000000000 1000000000000000 ...
              1000000000000 1000000000 1000000 1000 1]);

Тогда проверьте isKey(found, key). Если ключа нет в контейнере, то found(key) = 1.

Это выглядит довольно паршивым решением, даже если оно работает значительно быстрее, чем ismember. Любая помощь / предложения будут с благодарностью.

РЕДАКТИРОВАТЬ: Возможно, было бы лучше использовать mat2str для генерации ключа, а не этот продукт глупых точек?

Ответы [ 3 ]

1 голос
/ 10 августа 2017

Самый простой способ сгенерировать ключ / хэш в вашем случае - просто преобразовать вектор целочисленных значений в массив символов, используя char.Поскольку ваши целочисленные значения никогда не превышают 1000, а char может принимать числовые значения от 0 до 65535 (соответствующие символам Юникода), это даст вам уникальный ключ из 8 символов для каждого уникального вектора 8 на 1.Вот пример:

found = containers.Map('KeyType', 'char', 'ValueType', 'any');

v = randi(1000, [8 1]);  % Sample vector
key = char(v);
if ~isKey(found, key)
  found(key) = 1;
end
0 голосов
/ 14 мая 2013

Не совсем в хешировании, но все же верю, что нашел самый простой способ решения вашей проблемы.

Это работает примерно в 10 раз быстрее, чем ismember.

any(v(1)==M(1)&v(2)==M(2)&v(3)==M(3)&v(4)==M(4)&v(5)==M(5)&v(6)==M(6)&v(7)==M(7)&v(8)==M(8));
0 голосов
/ 19 июля 2011

ваша идея хороша. но вам нужно найти лучшую хэш-функцию. используйте некоторую стандартную хеш-функцию. Есть реализация алгоритмов 'ша', которую вы хотели бы увидеть:

http://www.se.mathworks.com/matlabcentral/fileexchange/31795-sha-algorithms-160224256384-512

Если вы обнаружите, что алгоритм ша медленно, то вы, вероятно, можете прибегнуть к некоторым уловкам. Вот о чем я могу думать сейчас:

  1. взять номер семени> 1000, например. 1024
  2. делит каждое число в векторе на начальное число и сохраняет остаток в строке.
  3. объединяет все остатки, которые будут служить вашим «кодом» для вашего векторного элемента. который можно использовать для сравнения, когда вы видите новый элемент.

это, вероятно, должно работать, но вам придется проверить.

...