MATLAB中的哈希表

w9apscun  于 6个月前  发布在  Matlab
关注(0)|答案(7)|浏览(113)

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)。
现在,我知道我不应该过早地优化,我可能根本没有这个问题,但请记住,这只是背景,可能有这样的情况,这真的是最好的解决方案,不管它是否是 * 我的 * 问题的最佳解决方案。

ilmyapht

ilmyapht1#

考虑使用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

字符串

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

p1iqtdky

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.EnumMapHashMapTreeMapLinkedHashMapHashtable)来获得更大的功能,如果不是性能的话。R2008 b之前的Matlab版本在任何情况下都没有真实的替代品,必须使用Java类。
使用Java Collection的一个潜在限制是它们无法包含非原始的Matlab类型,如struct。要克服这个问题,要么向下转换类型(例如,使用struct 2cell或编程),要么创建一个单独的Java对象,它将保存您的信息并将此对象存储在Java Collection中。
您可能也有兴趣研究纯Matlab面向对象(基于类)的Hashtable实现,即available on the File Exchange

pprl5pva

pprl5pva3#

你可以使用Java。
在matlab中:

dict = java.util.Hashtable;
dict.put('a', 1);
dict.put('b', 2);
dict.put('c', 3);
dict.get('b')

字符串
但你必须做一些分析,看看它是否给你一个速度增益,我想...

p1tboqfb

p1tboqfb4#

Matlab不支持哈希表。编辑直到r2010 a,也就是说;请参阅@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滤镜),或者您可以在傅立叶空间中进行滤镜,这对大图像特别有用,并且如果方差均匀分布(不幸的是,它们很可能不是)。

w1jd8yoj

w1jd8yoj5#

你可以通过变量名struct.(var)来访问任何结构体字段,其中var可以是任何变量,并且会相应地解析。

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

var = 'a';

display( dict.(var) ); % prints 1

字符串

sbdsn5lh

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

构建

字典可以从一组初始条目通过传递具有相等条目数的键和值数组来构造:

% From key and value arrays
>> d = dictionary(["a", "b", "c"], [1, 2, 3])
d = 
  dictionary (string ⟼ double) with 3 entries:

    "a" ⟼ 1
    "b" ⟼ 2
    "c" ⟼ 3

字符串
或者,初始条目可以作为键值对提供:

% Using Name=Value syntax (string keys only)
>> d = dictionary(a=1, b=2, c=3)  
d = 
  dictionary (string ⟼ double) with 3 entries:

    "a" ⟼ 1
    "b" ⟼ 2
    "c" ⟼ 3

>> squares = dictionary(2, 4, 3, 9, 4, 16)
squares =
  dictionary (double ⟼ double) with 3 entries:
    2 ⟼ 4
    3 ⟼ 9
    4 ⟼ 16


要创建一个未配置的字典,您可以使用dictionary,而无需任何输入:

>> d_unconfigured = dictionary
d_unconfigured =
  dictionary with unset key and value types.


一旦您分配了一个条目,字典将被配置。
要使用预配置的键和值类型构造空字典,可以使用configureDictionary(R2023b或更高版本):

>> d_empty = configureDictionary("string", "double")
d_empty =
  dictionary (string ⟼ double) with no entries.

单键:

>> d("a")
ans =
     1


同时查找一个keys数组:

>> k = [ "a" "b"
         "b" "c" ];
>> d(k)
ans =
     1     2
     2     3


无效键查找时出错:

>> d("bad key")
Error using  () 
Key not found. 

>> d(123)
Error using  () 
Key not found.


MATLAB R2023b引入了lookup函数,允许您指定回退值:

>> d.lookup("a", FallbackValue=nan)
ans =
     1

>> d.lookup("missing", FallbackValue=nan)
ans =
   NaN

赋值

>> d("new") = 10
d =
  dictionary (string ⟼ double) with 4 entries:
    "a"   ⟼ 1
    "b"   ⟼ 2
    "c"   ⟼ 3
    "new" ⟼ 10


如果可以进行转换,则值将自动封送到值类型中。如果不可以进行转换,则发出错误:

d("new") = "123"  % Note: string instead of double
d =
  dictionary (string ⟼ double) with 4 entries:
    "a"   ⟼ 1
    "b"   ⟼ 2
    "c"   ⟼ 3
    "new" ⟼ 123

>> d("new") = @sum
Error using  () 
Unable to use 'function_handle' as value for dictionary with 'double' value type.
Caused by:
    Conversion to double from function_handle is not possible

删除

键可以通过分配一个空数组[]来删除:

>> d("a") = []
d =
  dictionary (string ⟼ double) with 2 entries:
    "b" ⟼ 2
    "c" ⟼ 3


键的数组也可以用在左边,就像上面的赋值下面看到的那样。
MATLAB 2023b引入了remove函数,其行为与分配[]相同:

>> d.remove("a")
ans =
  dictionary (string ⟼ double) with 2 entries:
    "b" ⟼ 2
    "c" ⟼ 3

大小

参赛作品数量:

>> d.numEntries
ans =
     3

提取键值集合

键和值数组:

>> d.keys
ans = 
  3×1 string array
    "a"
    "b"
    "c"

>> d.values
ans =
     1
     2
     3


table

>> d.entries
ans =
  3×2 table
    Key    Value
    ___    _____
    "a"      1  
    "b"      2  
    "c"      3

查询类型配置

查询键和值类型:

>> [kt, vt] = d.types
kt = 
    "string"
vt = 
    "double"

检查字典是否配置了键和值类型:

>> d.isConfigured
ans =
  logical
   1

没有任何初始条目的字典在未配置的情况下启动:

>> d2 = dictionary
d2 =
  dictionary with unset key and value types.

>> d2.isConfigured
ans =
  logical
   0

>> [kt, vt] = d2.types
kt = 
    <missing>
vt = 
    <missing>

一旦分配了条目,未配置的字典将立即变为已配置:

>> d2("key") = "value"
d2 =
  dictionary (string ⟼ string) with 1 entry:
    "key" ⟼ "value"

>> d2.isConfigured
ans =
  logical
   1
ha5z0ras

ha5z0ras7#

你也可以利用新的类型“表”。你可以存储不同类型的数据,并从中获得统计数据。更多信息请参阅http://www.mathworks.com/help/matlab/tables.html

相关问题