MATLAB中的哈希表

MATLAB中的哈希表,matlab,hashtable,Matlab,Hashtable,MATLAB是否支持哈希表 一些背景 我正在用Matlab解决一个问题,这个问题需要图像的尺度空间表示。为此,我为k在一定范围内创建了一个方差sigma*s^k的二维高斯滤波器,然后依次使用每个滤波器对图像进行滤波。现在,我需要从k到过滤图像的某种映射 如果k始终是一个整数,我只需创建一个3D数组,以便: arr[k] = <image filtered with k-th guassian> arr[find(array_of_ks_ = k)] = <image fil

MATLAB是否支持哈希表


一些背景 我正在用Matlab解决一个问题,这个问题需要图像的尺度空间表示。为此,我为
k
在一定范围内创建了一个方差
sigma*s^k
的二维高斯滤波器,然后依次使用每个滤波器对图像进行滤波。现在,我需要从
k
到过滤图像的某种映射

如果
k
始终是一个整数,我只需创建一个3D数组,以便:

arr[k] = <image filtered with k-th guassian>
arr[find(array_of_ks_ = k)] = <image filtered with k-th guassian>
乍一看,这似乎相当不错,但我将使用大约20或30个
k
值进行数千次查找,我担心这会影响性能

我想知道,如果我使用某种哈希表这样做,我的查找时间是O(1)而不是O(n),是否会更好



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

Matlab不支持哈希表编辑直到r2010a,即;请看下面的答案

要加快查找速度,您可以放下
查找
,然后使用


假设
array\u of_ks
按升序排序,GaussFilter根据方差计算滤波器掩码大小(当然,使用2个1D滤波器),或者您可以在傅里叶空间中进行滤波,这对于大图像特别有用,并且如果方差间隔均匀(很可能不是很不幸).

您可以使用java

在matlab中:

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

但是,您必须进行一些分析,看看它是否能提高速度,我想…

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

    • 这有点复杂,但我很惊讶没有人建议使用structs。您可以通过变量名访问任何结构字段,如
      struct.(var)
      其中
      var
      可以是任何变量,并将进行适当解析

      dict.a = 1;
      dict.b = 2;
      
      var = 'a';
      
      display( dict.(var) ); % prints 1
      
      MatlabR2008B(7.7)的新容器。Map类是该接口的缩小版Matlab。它还具有与所有Matlab类型(例如)无缝集成的额外好处,以及自Matlab7.10(R2010a)发布以来的功能

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

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


      您可能还想研究一个纯粹的Matlab面向对象(基于类)哈希表实现,它是

      您还可以利用新类型的“表格”。您可以存储不同类型的数据,并从中轻松获取统计信息。
      有关更多信息,请参阅。

      哇,我不知道+1.您知道它们是否比逻辑索引快得多吗?Containers.Map是在Matlab7.7(R2008b)中添加的,请参见。R2010a中新增了一个构造函数,用于指定键类型和值类型。M=containers.Map('KeyType',kType,'ValueType',vType)@Jonas:我还没有广泛使用它们,看看它们与使用逻辑索引进行查找的比较会很有趣。@zellus,@amro:Matlab中没有命令的历史记录,这不是很烦人吗?lookup:rainfallMap('Jan');分配:rainfallMap('Jan')='zero';检查:rainfallMap.values;rainfallMap.keys;rainfallMap.size;检查键:rainfallMap.isKey('Today');如果使用数字作为字段名,则会中断:
      dict.('2')
      :此外,变量必须是整数:
      dict.(['k',num2str(1)]
      工作,但
      dict.(['k',num2str(1.1)]
      失败,如果值是整数,则可以直接使用它们进行索引。否则这是个好主意。@Amro,@Jonas,fair points,如果键是整数,你就不需要使用这个技巧(数组会更有意义)…如果键是任意浮点数,这就更具挑战性了,但是我会用一个字母作为前缀,并用一个
      \uuu
      替换
      。通过在添加为字段名之前对字符串进行变量化,可以避免上述使用结构的问题:
      dict.(genvarname(['k',num2str(1.1)])
      今天发布的另一个基于Matlab类的实现:
      values = rainfallMap.values;
      keys = rainfallMap.keys;
      sz = rainfallMap.size;
      
      if rainfallMap.isKey('Today')
          ...
      end
      
      dict.a = 1;
      dict.b = 2;
      
      var = 'a';
      
      display( dict.(var) ); % prints 1