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

Eri*_*ric 5 performance matlab key vector hashmap

我有一个正在查看许多元素的函数.每个元素都是8x1列向量的形式.向量中的每个条目都是一个小于1000的整数.每次看到这样的向量时,我都想将它添加到"已经看过"的向量列表中,然后检查该向量是否已经在此列表中.该函数将检查约100,000个这样的向量的顺序.

最初我尝试使用ismember(v', M, 'rows'),但发现这很慢.接下来我尝试了:

found = containers.Map('KeyType', 'double', 'ValueType', 'any');
Run Code Online (Sandbox Code Playgroud)

然后每次我检查一个新的向量v,计算:

key = dot(v, [1000000000000000000000 1000000000000000000 1000000000000000 ...
              1000000000000 1000000000 1000000 1000 1]);
Run Code Online (Sandbox Code Playgroud)

然后检查isKey(found, key).如果密钥不在容器中,那么found(key) = 1.

这似乎是一个非常糟糕的解决方案,即使它的运行速度要快得多ismember.任何帮助/建议将不胜感激.

编辑:也许用它mat2str来生成密钥更好,而不是这个傻点产品?

A. *_* K. 0

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

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

如果您发现 sha 算法很慢,那么您可能可以采取一些技巧。我现在能想到的一个如下:

  1. 取种子数 > 1000 例如 1024
  2. 将向量中的每个数字除以种子,并将余数存储在字符串中。
  3. 连接所有余数,作为向量元素的“代码”。当您看到新元素时,可以使用它进行比较。

这可能应该有效,但你必须检查一下。

  • Java 调用会产生一些开销,但每次哈希计算只需支付几次。事实证明,您链接的文件交换功能(就像网络上的许多自己编写的加密代码一样)质量低下,这一事实超过了这一点。在测试中,我必须修改它才能完全可用,并且基于 java.security.MessageDigest 的简单实现速度快了 600 倍,在大约 0.0001 秒与 0.6700 秒内完成 Eric 的 8 长向量。“Matlab 中的 Java 速度很慢”是一种过于简单化的说法。 (13认同)
  • 我要冒险说:“不要从网络上下载自己的加密代码”。您可以直接从 Matlab 调用 Java 的标准 `java.security.MessageDigest` 类,使用 `typecast(v,'int8')` 将 Matlab `double` 数组转换为 Java `byte[]`,然后 dec2hex 得到答案,如果您需要字符串形式。它可能比文件交换版本更快、更正确。 (7认同)
  • 加密哈希完全不适合字典键,因为*它们的设计速度很慢,使得暴力攻击更加昂贵*。 (6认同)