有没有办法在matlab中使用hashtables/hashmaps?

whi*_*ile 15 matlab data-structures

可能重复:
MATLAB中的哈希表

一般问题

有没有办法在Matlab中获取hashset或hashmap结构?

我经常发现自己处于需要查找唯一条目或检查向量成员资格并使用命令unique()或逻辑索引的情况下搜索向量并且对于大型值集合来说非常慢.在Matlab中执行此操作的最佳方法是什么?

比如说,我有一个素数列表,并想检查3是否为素数:

primes = [2,3,5,7,11,13];

if primes(primes==3)
    disp('yes!')
else
    disp('no!')
end
Run Code Online (Sandbox Code Playgroud)

如果我用长向量做这个,很多时候事情变得很慢.

在其他语言中

所以基本上,是否有任何等效的python set()dict(),或类似的Java java.util.HashSetjava.util.HashMapMatlab?如果没有,有没有什么好的方法在大型向量中进行查找?

编辑:对答案的反思

这是我在答案中得到建议的运行时间.

>> b = 1:1000000;
>> tic; for i=1:100000, any(b==i);; end; toc
Elapsed time is 125.925922 seconds.

s = java.util.HashSet();
>> for i=1:1000000, s.add(i); end    
>> tic; for i=1:100000, s.contains(i); end; toc
Elapsed time is 25.618276 seconds.

>> m = containers.Map(1:1000000,ones(1,1000000));
>> tic; for i=1:100000, m(i); end; toc
Elapsed time is 2.715635 seconds
Run Code Online (Sandbox Code Playgroud)

java集的构造虽然很慢,但取决于问题,这也可能非常慢.非常高兴容器.地图提示.它真的摧毁了其他的例子,它也立即设置了.

Chr*_*lor 19

像这样?

>> m = java.util.HashMap;
>> m.put(1,'hello,world');
>> m.get(1)
ans =
hello, world
Run Code Online (Sandbox Code Playgroud)

或者,如果您想要一个Matlab本机实现,请尝试

>> m = containers.Map;
>> m('one') = 1;
>> m('one')
ans =
     1
Run Code Online (Sandbox Code Playgroud)

这实际上是键入的 - 它将接受的唯一键是类型的键char.您可以在创建地图时指定键和值类型:

>> m =  containers.Map('KeyType','int32','ValueType','double');
>> m(1) = 3.14;
>> m(1)
ans =
  3.14
Run Code Online (Sandbox Code Playgroud)

如果您尝试放置int32除a 之外的任何键以及除a 之外的任何值,您将收到错误double.

您还可以使用套件:

>> s = java.util.HashSet;
>> s.put(1);
>> s.contains(1)
ans = 
     1
>> s.contains(2)
ans = 
     0
Run Code Online (Sandbox Code Playgroud)