我想在Matlab中构建一个哈希表,其中的键是不同大小的矩阵,其值也是矩阵。 containers.Map
类仅允许字符串作为键。我当然可以只使用一个单元格作为键,一个单元格用于值,并匹配两个单元格的索引。有没有更好的方法来构造哈希表和相关的哈希函数?
答案 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.Map
,as 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文件交换中还有一些有用的功能(例如here和here)。