代码之家  ›  专栏  ›  技术社区  ›  Nathan Fellman

matlab中的哈希表

  •  86
  • Nathan Fellman  · 技术社区  · 15 年前

    matlab是否支持哈希表?


    一些背景

    我在matlab中研究一个问题,这个问题需要图像的比例空间表示。为此,我创建了一个具有方差的二维高斯滤波器。 sigma*s^k 对于 k 在某些范围内,然后我依次使用每一个来过滤图像。现在,我想从 K 过滤后的图像。

    如果 K 总是一个整数,我只需创建一个三维数组,这样:

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


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

    6 回复  |  直到 11 年前
        1
  •  14
  •   Community Mohan Dere    9 年前

    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个一维过滤器)计算过滤器遮罩大小,或者您可以在傅立叶空间中进行过滤,这对于大图像尤其有用,如果方差间隔均匀(很可能不会很不幸)。

        2
  •  117
  •   Amro    13 年前

    考虑使用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
      
        3
  •  25
  •   Community Mohan Dere    9 年前

    matlab r2008b(7.7)的新容器。map类是 java.util.Map 接口。它具有与所有matlab类型无缝集成的额外好处( Java Maps cannot handle Matlab structs 例如)以及从matlab 7.10(r2100a)到 specify data types .

    需要关键值地图/字典的严重的MATLAB实现仍然应该使用Java AES的映射类( java.util.EnumMap , HashMap , TreeMap , LinkedHashMap Hashtable )如果没有性能,则可以访问它们的更大功能。比R088B早的MATLAB版本在任何情况下都没有真正的替代品,必须使用Java类。

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

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

        4
  •  18
  •   tauran    15 年前

    你可以用Java来实现它。

    在MATLAB中:

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

    但你必须做一些分析,看看它是否给你一个速度增益,我猜…

        5
  •  12
  •   Mark Elliot    15 年前

    这有点笨拙,但我很惊讶没有人建议使用结构。可以通过变量名访问任意结构字段 struct.(var) 在哪里? var 可以是任何变量,并将进行适当的解析。

    dict.a = 1;
    dict.b = 2;
    
    var = 'a';
    
    display( dict.(var) ); % prints 1
    
        6
  •  1
  •   Lei Zhang    11 年前

    您还可以利用新类型的“表”。您可以存储不同类型的数据,并非常容易地从中获得统计信息。 见 http://www.mathworks.com/help/matlab/tables.html 更多信息。