首页 > 解决方案 > 带有矩阵键的 Matlab 哈希表

问题描述

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

标签: matlabhashcontainers

解决方案


我只是玩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~ñ¿'

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

>> 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键。键可以是字符数组,也可以是数字标量;它们不能是数值数组:

>> 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.

因此,您可以从数组中计算哈希值(作为浮点双精度值或 64 位整数值)。我不知道如何最好地做到这一点,也许是具有一组随机值的点积?在这个相关的问题上,有一些建议。MATLAB File Exchange 上也有一些有用的函数(例如这里这里)。


推荐阅读