MATLAB中的哈希表
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解决一个问题,这个问题需要图像的尺度空间表示。为此,我为
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