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