MATLAB支持哈希表吗?
背景介绍
我在Matlab中处理一个需要图像的尺度空间表示的问题。为了做到这一点,我创建了一个2-D高斯滤波器,其中k
的方差为sigma*s^k
在某个范围内。,然后我依次使用每个滤波器来过滤图像。现在,我需要从k
到过滤图像的某种Map。
如果k
总是整数,我只需要创建一个3D数组,使得:
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)。
现在,我知道我不应该过早地优化,我可能根本没有这个问题,但请记住,这只是背景,可能有这样的情况,这真的是最好的解决方案,不管它是否是 * 我的 * 问题的最佳解决方案。
7条答案
按热度按时间ilmyapht1#
考虑使用MATLAB的map类:containers.Map。下面是一个简短的概述:
字符串
型
型
型
型
型
型
p1iqtdky2#
Matlab R2008 b(7.7)的新容器。Map类是java.util.Map接口的缩小版Matlab。它具有与所有Matlab类型(例如Java Maps cannot handle Matlab structs)无缝集成的额外好处,以及自Matlab 7.10(R2010 a)到specify data types的能力。
需要键值Map/字典的严肃的Matlab实现仍然应该使用Java的Map类(java.util.EnumMap,HashMap,TreeMap,LinkedHashMap或Hashtable)来获得更大的功能,如果不是性能的话。R2008 b之前的Matlab版本在任何情况下都没有真实的替代品,必须使用Java类。
使用Java Collection的一个潜在限制是它们无法包含非原始的Matlab类型,如struct。要克服这个问题,要么向下转换类型(例如,使用struct 2cell或编程),要么创建一个单独的Java对象,它将保存您的信息并将此对象存储在Java Collection中。
您可能也有兴趣研究纯Matlab面向对象(基于类)的Hashtable实现,即available on the File Exchange。
pprl5pva3#
你可以使用Java。
在matlab中:
字符串
但你必须做一些分析,看看它是否给你一个速度增益,我想...
p1tboqfb4#
Matlab不支持哈希表。编辑直到r2010 a,也就是说;请参阅@Amro的答案。
为了加快查找速度,您可以删除
find
,而使用LOGICAL INDEXING。字符串
或
型
然而,在我使用Matlab的所有经验中,我从来没有遇到过查找成为瓶颈的情况。
为了加速您的特定问题,我建议您使用增量过滤
型
假设
array_of_ks
按升序排序,GaussFilter根据方差计算滤镜掩码大小(当然,使用2个1D滤镜),或者您可以在傅立叶空间中进行滤镜,这对大图像特别有用,并且如果方差均匀分布(不幸的是,它们很可能不是)。w1jd8yoj5#
你可以通过变量名
struct.(var)
来访问任何结构体字段,其中var
可以是任何变量,并且会相应地解析。字符串
sbdsn5lh6#
MATLAB 2022 b添加了
dictionary
对象。完整的使用指南可以在MATLAB文档中的Language Fundamentals > Data Types > Dictionaries下找到。现在推荐使用
dictionary
而不是旧的containers.Map
。引用containers.Map
的文档:推荐使用
dictionary
而不是containers.Map
,因为它接受更多的数据类型作为键和值,并提供更好的性能。(自R2022 b起)R2022b发行说明:
在几乎所有用例中,
dictionary
的执行速度都比containers.Map
快。有关
containers.Map
的用法,请参阅Amro's answer。构建
字典可以从一组初始条目通过传递具有相等条目数的键和值数组来构造:
字符串
或者,初始条目可以作为键值对提供:
型
要创建一个未配置的字典,您可以使用
dictionary
,而无需任何输入:型
一旦您分配了一个条目,字典将被配置。
要使用预配置的键和值类型构造空字典,可以使用
configureDictionary
(R2023b或更高版本):型
单键:
型
同时查找一个keys数组:
型
无效键查找时出错:
型
MATLAB R2023b引入了
lookup
函数,允许您指定回退值:型
赋值
型
如果可以进行转换,则值将自动封送到值类型中。如果不可以进行转换,则发出错误:
型
删除
键可以通过分配一个空数组
[]
来删除:型
键的数组也可以用在左边,就像上面的赋值下面看到的那样。
MATLAB 2023b引入了
remove
函数,其行为与分配[]
相同:型
大小
参赛作品数量:
型
提取键值集合
键和值数组:
型
table:
查询类型配置
查询键和值类型:
检查字典是否配置了键和值类型:
没有任何初始条目的字典在未配置的情况下启动:
一旦分配了条目,未配置的字典将立即变为已配置:
ha5z0ras7#
你也可以利用新的类型“表”。你可以存储不同类型的数据,并从中获得统计数据。更多信息请参阅http://www.mathworks.com/help/matlab/tables.html。