如何在MATLAB中为此向量生成映射键?

时间:2011-07-19 17:22:43

标签: matlab performance vector hashmap key

我有一个正在查看许多元素的函数。每个元素都是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 个答案:

答案 0 :(得分:1)

在您的情况下生成密钥/哈希的最简单方法是使用char将整数值的向量转换为字符数组。由于您的整数值永远不会超过1000,char可以接受0到65535之间的数字值(对应于Unicode字符),这将为每个唯一的8 x 1向量提供唯一的8字符键。这是一个例子:

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

答案 1 :(得分:0)

你的想法很好。但是你需要找到一个更好的哈希函数。使用一些标准的哈希函数。 您希望看到“sha”算法的实现:

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

如果你发现sha算法很慢,你可能会采取一些技巧。我现在能想到的就是:

  1. 取种子数> 1000例如1024
  2. 将种子中的每个数字除以种子,并将余数存储在一个字符串中。
  3. 连接所有剩余部分,它们将作为vector元素的“代码”。当你看到一个新元素时可用于比较。
  4. 这应该可行,但你必须检查。

答案 2 :(得分:0)

并非真正进入哈希,但仍然相信找到了解决问题的最简单方法。

这比ismember快10倍。

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));