我有一个正在查看许多元素的函数。每个元素都是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
生成密钥,而不是这个愚蠢的点产品?
答案 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)
http://www.se.mathworks.com/matlabcentral/fileexchange/31795-sha-algorithms-160224256384-512
如果你发现sha算法很慢,你可能会采取一些技巧。我现在能想到的就是:
这应该可行,但你必须检查。
答案 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));