MATLAB中的哈希表

时间:2010-08-28 18:32:04

标签: matlab hashtable

MATLAB是否支持哈希表?


一些背景

我正在研究Matlab中需要图像的缩放空间表示的问题。为此,我在某个范围内为sigma*s^k创建了一个二阶高斯滤波器,其方差为k,然后我依次使用每个滤波器对图像进行滤波。现在,我希望从k到过滤后的图像进行某种映射。

如果k总是一个整数,我只需创建一个3D数组:

arr[k] = <image filtered with k-th guassian>

但是,k不一定是整数,所以我不能这样做。我想做的是保留一组k,以便:

arr[find(array_of_ks_ = k)] = <image filtered with k-th guassian>

初看起来似乎相当不错,除了我将使用k的约20或30个值进行此次查找可能几千次,我担心这会损害性能。

我想知道使用某种哈希表做这件事是不是更好,这样我的查找时间就是O(1)而不是O(n)。


现在,我知道我不应该过早地进行优化,我可能根本没有这个问题,但请记住,这只是背景,并且可能存在这种情况,这确实是最佳解决方案,无论是否它是我的问题的最佳解决方案。

6 个答案:

答案 0 :(得分:117)

考虑使用MATLAB的地图类:containers.Map。以下是简要概述:

  • 创建:

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

答案 1 :(得分:25)

Matlab R2008b(7.7)的新容器.Map类是java.util.Map接口的缩小版Matlab版本。它具有与所有Matlab类型(例如Java Maps cannot handle Matlab structs)无缝集成的额外好处,以及从Matlab 7.10(R2010a)到specify data types的能力。

需要键值映射/词典的严格Matlab实现仍应使用Java的Map类(java.util.EnumMapHashMapTreeMapLinkedHashMapHashtable)如果不是性能,则可以访问更大的功能。早于R2008b的Matlab版本在任何情况下都没有真正的替代方案,必须使用Java类。

使用Java Collections的一个潜在限制是它们无法包含非原始Matlab类型,例如结构。要解决这个问题,可以下转换类型(例如,使用struct2cell或以编程方式),或者创建一个单独的Java对象来保存您的信息并将该对象存储在Java Collection中。

您可能还有兴趣检查纯Matlab面向对象(基于类)的Hashtable实现,即available on the File Exchange

答案 2 :(得分:18)

您可以使用java。

在matlab中:

dict = java.util.Hashtable;
dict.put('a', 1);
dict.put('b', 2);
dict.put('c', 3);
dict.get('b')

但你必须做一些分析,看看它是否能让你获得速度提升......

答案 3 :(得分:14)

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的所有经验中,我永远不会将查找作为瓶颈。


为了加快您的具体问题,我建议您使用增量过滤

arr{i} = GaussFilter(arr{i-1},sigma*s^(array_of_ks(i)) - sigma*s^(array_of_ks(i-1)))

假设array_of_ks按升序排序,GaussFilter根据方差计算过滤器掩码大小(当然使用2个1D过滤器),或者您可以在傅里叶空间中进行过滤,这是特别有用的对于大图像,如果方差均匀分布(很可能不是很遗憾)。

答案 4 :(得分:12)

这有点古怪,但我很惊讶没有人建议使用结构。您可以按变量名称访问任何结构字段struct.(var),其中var可以是任何变量,并将适当解析。

dict.a = 1;
dict.b = 2;

var = 'a';

display( dict.(var) ); % prints 1

答案 5 :(得分:1)

您还可以利用新类型“表格”。您可以存储不同类型的数据,并从中获取统计数据非常简单。 有关详细信息,请参阅http://www.mathworks.com/help/matlab/tables.html