MATLAB中的哈希表

Nat*_*man 89 matlab hashtable

MATLAB是否支持哈希表?


一些背景

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

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

arr[k] = <image filtered with k-th guassian>
Run Code Online (Sandbox Code Playgroud)

但是,k不一定是整数,所以我不能这样做.我想做的是保持一系列的ks:

arr[find(array_of_ks_ = k)] = <image filtered with k-th guassian>
Run Code Online (Sandbox Code Playgroud)

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

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


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

Amr*_*mro 118

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

  • @ zellus,@ amro:在Matlab中如何没有命令历史,这不是很烦人吗? (8认同)
  • 哇,我不知道!+1.你知道它们是否比逻辑索引更快吗? (7认同)
  • 查找:rainfallMap('Jan'); 分配:rainfallMap('Jan')='零'; 检查:rainfallMap.values; rainfallMap.keys; rainfallMap.size; 检查键:rainfallMap.isKey('今天'); (4认同)
  • 在MATLAB 7.7(R2008b)中添加了Containers.Map,请参阅http://www.mathworks.com/access/helpdesk/help/techdoc/rn/brqyzax-1.html.R2010a中的新增功能是一个构造函数,用于指定键类型和值类型.M = containers.Map('KeyType',kType,'ValueType',vType) (3认同)

Yai*_*man 25

Matlab R2008b(7.7)的新容器.Map类是java.util.Map接口的缩小版Matlab版本.它具有与所有Matlab类型(例如Java Maps无法处理Matlab结构)无缝集成的额外好处,以及自Matlab 7.10(R2010a)指定数据类型以来的能力.

需要键值映射/字典的严格Matlab实现仍然应该使用Java的Map类(java.util.EnumMap,HashMap,TreeMap,LinkedHashMapHashtable)来获得对其更大功能的访问,如果不是性能的话.早于R2008b的Matlab版本在任何情况下都没有真正的替代品,必须使用Java类.

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

您可能还有兴趣检查一个纯-Matlab面向对象(基于类)的Hashtable实现,该实现可在File Exchange上获得.


tau*_*ran 18

你可以使用java.

在matlab中:

dict = java.util.Hashtable;
dict.put('a', 1);
dict.put('b', 2);
dict.put('c', 3);
dict.get('b')
Run Code Online (Sandbox Code Playgroud)

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


Jon*_*nas 14

Matlab不支持哈希表.编辑直到r2010a,那是; 看@Amro的回答.

要加快查找速度,您可以删除find,并使用LOGICAL INDEXING.

arr{array_of_ks==k} = <image filtered with k-th Gaussian>
Run Code Online (Sandbox Code Playgroud)

要么

arr(:,:,array_of_ks==k) = <image filtered with k-th Gaussian>
Run Code Online (Sandbox Code Playgroud)

但是,在我使用Matlab的所有经验中,我从来没有将查找作为瓶颈.


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

arr{i} = GaussFilter(arr{i-1},sigma*s^(array_of_ks(i)) - sigma*s^(array_of_ks(i-1)))
Run Code Online (Sandbox Code Playgroud)

假设array_of_ks按升序排序,GaussFilter根据方差计算过滤器蒙版大小(当然也使用2个1D过滤器),或者可以在傅立叶空间中过滤,这对于大图像特别有用,如果差异是间隔均匀(很可能不是很遗憾).


Mar*_*iot 12

这有点笨拙,但我很惊讶没有人建议使用结构.您可以通过变量名访问任何结构字段,因为struct.(var)var可以是任何变量,并将适当地解析.

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

var = 'a';

display( dict.(var) ); % prints 1
Run Code Online (Sandbox Code Playgroud)

  • 通过在添加字段名称之前对字符串进行变换来避免上述使用结构的问题:`dict.(genvarname(['k',num2str(1.1)]))` (6认同)