MATLAB中的哈希表
MATLAB是否支持散列表?
一些背景
我正在研究Matlab中的一个问题,需要图像的尺度空间表示。 为了做到这一点,我创build了一个二维高斯滤波器,在一定范围内为方差sigma*s^k
,然后我依次使用每一个滤波器来过滤图像。 现在,我想要从k
到过滤图像的某种映射。
如果k
总是一个整数,我只需创build一个3D数组,以便:
arr[k] = <image filtered with k-th guassian>
但是, k
不一定是整数,所以我不能这样做。 我想要做的是保持一系列k
s,使得:
arr[find(array_of_ks_ = k)] = <image filtered with k-th guassian>
一开始想起来似乎相当不错,除了我会用大约20或30的k
值来进行这种查找,可能会有几千次,我担心这会损害性能。
我想知道是否我不能更好地使用某种哈希表来做这件事,这样我的查找时间就是O(1)而不是O(n)。
现在,我知道我不应该过早优化,我可能根本没有这个问题,但请记住,这只是背景,可能会有这样的情况,这是最好的解决scheme,无论它是我的问题的最佳解决scheme。
Matlab不支持哈希表。 编辑直到r2010a,那是; 看@Amro的答案。
要加快查找速度,可以删除find
,然后使用LOGICAL INDEXING 。
arr{array_of_ks==k} = <image filtered with k-th Gaussian>
要么
arr(:,:,array_of_ks==k) = <image filtered with k-th Gaussian>
然而,在我所有使用Matlab的经验中,我从来没有把查找当成一个瓶颈。
为了加速你的具体问题,我build议使用增量过滤
arr{i} = GaussFilter(arr{i-1},sigma*s^(array_of_ks(i)) - sigma*s^(array_of_ks(i-1)))
假设array_of_ks
按升序sorting,GaussFilter根据方差(当然使用2个1D滤波器)计算滤波器的屏蔽尺寸,或者可以在傅立叶空间中进行滤波,这对于大的图像特别有用,如果方差间隔均匀(他们最有可能不幸的是)。
考虑使用MATLAB的映射类: containers.Map 。 这里是一个简要的概述:
-
创build:
>> keys = {'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', ... 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec', 'Annual'}; >> values = {327.2, 368.2, 197.6, 178.4, 100.0, 69.9, ... 32.3, 37.3, 19.0, 37.0, 73.2, 110.9, 1551.0}; >> rainfallMap = containers.Map(keys, values) rainfallMap = containers.Map handle Package: containers Properties: Count: 13 KeyType: 'char' ValueType: 'double' Methods, Events, Superclasses
-
抬头:
x = rainfallMap('Jan');
-
分配:
rainfallMap('Jan') = 0;
-
加:
rainfallMap('Total') = 999;
-
去掉:
rainfallMap.remove('Total')
-
检查:
values = rainfallMap.values; keys = rainfallMap.keys; sz = rainfallMap.size;
-
检查密钥:
if rainfallMap.isKey('Today') ... end
Matlab R2008b(7.7)的新容器.Map类是java.util.Map接口的一个缩小的Matlab版本。 它具有与所有Matlabtypes( Java Maps无法处理Matlab结构 )无缝集成以及从Matlab 7.10(R2010a) 指定数据types的能力的额外好处。
严重的Matlab实现需要键值映射/字典仍然应该使用Java的Map类( java.util.EnumMap , HashMap , TreeMap , LinkedHashMap或Hashtable )来访问其性能较高的function。 早于R2008b的Matlab版本在任何情况下都没有真正的select,并且必须使用Java类。
使用Java Collections的一个潜在的限制是它们不能够包含像结构体这样的非原始的Matlabtypes。 为了克服这个问题,可以下载types(例如,使用struct2cell或者编程方式),或者创build一个单独的Java对象来保存你的信息并把这个对象存储在Java Collection中。
您可能也有兴趣检查一个纯的Matlab面向对象(基于类)的散列表实现,它可以在文件交换中find 。
你可以使用它的Java。
在matlab中:
dict = java.util.Hashtable; dict.put('a', 1); dict.put('b', 2); dict.put('c', 3); dict.get('b')
但是,你将不得不做一些分析,看看它是否给你一个速度增益我猜…
这有点令人吃惊,但我很惊讶没有人build议使用结构。 你可以通过variables名作为struct.(var)
来访问任何struct字段,其中var
可以是任何variables,并且可以正确parsing。
dict.a = 1; dict.b = 2; var = 'a'; display( dict.(var) ); % prints 1
您也可以利用新的“表格”types。 您可以存储不同types的数据,并从中获取统计信息。 有关更多信息,请参阅http://www.mathworks.com/help/matlab/tables.html 。