MATLAB中的哈希表

2024-06-13 01:06:19 发布

您现在位置:Python中文网/ 问答频道 /正文

MATLAB是否支持哈希表?


一些背景

我在Matlab中处理一个需要图像的比例空间表示的问题。为此,我创建了一个二维高斯滤波器,在一定范围内k的方差为sigma*s^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>

乍一看似乎不错,不过我可能要用20或30个k值进行几千次查找,我担心这会影响性能。

我想知道,如果我用某种散列表来完成这项工作,这样我的查找时间就不是O(n),而是O(1)。


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


Tags: 图像imagewith空间整数数组解决方案filtered
3条回答

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滤波器),或者您可以在Fourier空间中进行滤波,这对于大型图像尤其有用,如果方差间隔均匀(很可能不会很不幸)。

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

需要键值映射/字典的严肃的Matlab实现应该仍然使用Java的映射类(java.util.EnumMapHashMapTreeMapLinkedHashMapHashtable)来获得更大的功能(如果不是性能的话)。早于R2008b的Matlab版本在任何情况下都没有真正的替代方案,必须使用Java类。

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

您还可能有兴趣研究纯Matlab面向对象(基于类)哈希表实现,即available on the File Exchange

考虑使用MATLAB的map类: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
    

相关问题 更多 >