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
不一定是整数,所以我不能这样做.我想做的是保持一系列的k
s:
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.以下是简要概述:
创建:
>> 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
Run Code Online (Sandbox Code Playgroud)抬头:
x = rainfallMap('Jan');
Run Code Online (Sandbox Code Playgroud)分配:
rainfallMap('Jan') = 0;
Run Code Online (Sandbox Code Playgroud)加:
rainfallMap('Total') = 999;
Run Code Online (Sandbox Code Playgroud)去掉:
rainfallMap.remove('Total')
Run Code Online (Sandbox Code Playgroud)检查:
values = rainfallMap.values;
keys = rainfallMap.keys;
sz = rainfallMap.size;
Run Code Online (Sandbox Code Playgroud)检查键:
if rainfallMap.isKey('Today')
...
end
Run Code Online (Sandbox Code Playgroud)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,LinkedHashMap或Hashtable)来获得对其更大功能的访问,如果不是性能的话.早于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)
归档时间: |
|
查看次数: |
50175 次 |
最近记录: |