带矩阵键的Matlab哈希表

时间:2018-06-13 23:38:59

标签: matlab hash containers

我想在Matlab中构建一个哈希表,其中的键是不同大小的矩阵,其值也是矩阵。 containers.Map类仅允许字符串作为键。我当然可以只使用一个单元格作为键,一个单元格用于值,并匹配两个单元格的索引。有没有更好的方法来构造哈希表和相关的哈希函数?

1 个答案:

答案 0 :(得分:1)

我刚刚和containers.Map玩了一下,似乎你可以使用任意长度的char数组作为键。

>> a = containers.Map;
>> a(repmat('bla',50,500)) = 1;
>> a(repmat('bla',50,500))
ans =
     1

您还可以将任何数字数组转换为char数组,如下所示:

>> x = randn(4)
x =
   -0.7371   -0.0799    0.1129   -1.1667
   -1.7499    0.8985    0.4400   -1.8543
    0.9105    0.1837    0.1017   -1.1407
    0.8671    0.2908    2.7873   -1.0933

>> s = char(typecast(x(:),'uint8')')
s =
    ''uÔ_þ翼qÿû¿/å\¬"í?éúè#¿ë?.YðjÛs´¿Ó¶Ó·PÀì?+Ç? Õ9NÒ?Üéñé¼?
     °À9-(Ü?ç¥ìƺ?NsivL@V*aó¨ªò¿{Ò5«ý¿Q8ß:@ò¿í=µU~ñ¿'

或使用char允许的完整16位Unicode值:

>> s = char(typecast(x(:),'uint16')')
s =
    '疺㓦쁁뿛쓆遫뿅䅀庲뿋ꁰ頳劜㿡礋쮼㿘旈帡਑㿨ﮢ电玼㿼譍৊醪㿳랝趚蠷뿴瞶ꆲ쀂伴愹?㿬ꑨ꬞廆뿽㼝ὧ᛻㾱?ﺳ⩝㾢棑罓턽䀁ᕾ統렆뾱'

因此,将这些放在一起,可以将任何数组(正确转换为char数组)用作哈希表中的键:

>> a(s) = 5;
>> a(s)
ans =
     5

并且,假设数字数组转换为char,也可以将它转换回数值数组(尽管数组的形状会丢失):

x = randn(1,20);
s = char(typecast(x,'uint8'));
y = typecast(uint8(s),'double');
assert(isequal(x,y))  % does not throw an error

还有另一种选择。 可以使用与containers.Mapas stated in the documentation字符串不同类型的键。键可以是char数组,也可以是数字标量;它们不能是数字数组:

>> a = containers.Map('KeyType','double','ValueType','double');
>> a(5) = 10;
>> a([5,3]) = 5;
Error using containers.Map/subsasgn
Specified key type does not match the type expected for this container.

因此,您可以从数组中计算哈希值(作为浮点double值或64位整数值)。如何最好地做到这一点我不知道,也许是带有一组随机值的点积? this related question有一些建议。 MATLAB文件交换中还有一些有用的功能(例如herehere)。