MATLAB是否支持哈希表?
我正在研究Matlab中需要图像的缩放空间表示的问题。为此,我在某个范围内为sigma*s^k
创建了一个二阶高斯滤波器,其方差为k
,然后我依次使用每个滤波器对图像进行滤波。现在,我希望从k
到过滤后的图像进行某种映射。
如果k
总是一个整数,我只需创建一个3D数组:
arr[k] = <image filtered with k-th guassian>
但是,k
不一定是整数,所以我不能这样做。我想做的是保留一组k
,以便:
arr[find(array_of_ks_ = k)] = <image filtered with k-th guassian>
初看起来似乎相当不错,除了我将使用k
的约20或30个值进行此次查找可能几千次,我担心这会损害性能。
我想知道使用某种哈希表做这件事是不是更好,这样我的查找时间就是O(1)而不是O(n)。
现在,我知道我不应该过早地进行优化,我可能根本没有这个问题,但请记住,这只是背景,并且可能存在这种情况,这确实是最佳解决方案,无论是否它是我的问题的最佳解决方案。
答案 0 :(得分:117)
考虑使用MATLAB的地图类: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
答案 1 :(得分:25)
Matlab R2008b(7.7)的新容器.Map类是java.util.Map接口的缩小版Matlab版本。它具有与所有Matlab类型(例如Java Maps cannot handle Matlab structs)无缝集成的额外好处,以及从Matlab 7.10(R2010a)到specify data types的能力。
需要键值映射/词典的严格Matlab实现仍应使用Java的Map类(java.util.EnumMap,HashMap,TreeMap,LinkedHashMap或Hashtable)如果不是性能,则可以访问更大的功能。早于R2008b的Matlab版本在任何情况下都没有真正的替代方案,必须使用Java类。
使用Java Collections的一个潜在限制是它们无法包含非原始Matlab类型,例如结构。要解决这个问题,可以下转换类型(例如,使用struct2cell或以编程方式),或者创建一个单独的Java对象来保存您的信息并将该对象存储在Java Collection中。
您可能还有兴趣检查纯Matlab面向对象(基于类)的Hashtable实现,即available on the File Exchange。
答案 2 :(得分:18)
您可以使用java。
在matlab中:
dict = java.util.Hashtable;
dict.put('a', 1);
dict.put('b', 2);
dict.put('c', 3);
dict.get('b')
但你必须做一些分析,看看它是否能让你获得速度提升......
答案 3 :(得分:14)
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个1D过滤器),或者您可以在傅里叶空间中进行过滤,这是特别有用的对于大图像,如果方差均匀分布(很可能不是很遗憾)。
答案 4 :(得分:12)
这有点古怪,但我很惊讶没有人建议使用结构。您可以按变量名称访问任何结构字段struct.(var)
,其中var
可以是任何变量,并将适当解析。
dict.a = 1;
dict.b = 2;
var = 'a';
display( dict.(var) ); % prints 1
答案 5 :(得分:1)
您还可以利用新类型“表格”。您可以存储不同类型的数据,并从中获取统计数据非常简单。 有关详细信息,请参阅http://www.mathworks.com/help/matlab/tables.html。