可能重复:
Hash tables in MATLAB
有没有办法在Matlab中获取hashset或hashmap结构?
我经常发现自己处于需要查找唯一条目或检查向量成员资格并使用unique()
之类的命令或逻辑索引似乎搜索向量并且对于大型值集合非常慢的情况。在Matlab中执行此操作的最佳方法是什么?
比如说,我有一个素数列表,并想检查3是否为素数:
primes = [2,3,5,7,11,13];
if primes(primes==3)
disp('yes!')
else
disp('no!')
end
如果我使用长向量执行此操作,很多时候事情变得非常缓慢。
基本上,在Matlab中是否有与python的set()
和dict()
或类似的Java java.util.HashSet
和java.util.HashMap
等效的等价物?如果没有,是否有任何好的方法在大型向量中进行查找?
这是我在答案中得到建议的运行时间。
>> 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
java集的构造也很慢,但根据问题,这可能也很慢。非常高兴容器。地图提示。它确实摧毁了其他的例子,它也立即设置了。
答案 0 :(得分:17)
喜欢这个吗?
>> m = java.util.HashMap;
>> m.put(1,'hello,world');
>> m.get(1)
ans =
hello, world
或者,如果您想要Matlab原生实现,请尝试
>> m = containers.Map;
>> m('one') = 1;
>> m('one')
ans =
1
这实际上是键入的 - 它将接受的唯一键是char
类型的键。您可以在创建地图时指定键和值类型:
>> m = containers.Map('KeyType','int32','ValueType','double');
>> m(1) = 3.14;
>> m(1)
ans =
3.14
如果您尝试放置int32
以外的任何密钥以及除double
以外的任何值,您现在会收到错误。
您还可以使用套装:
>> s = java.util.HashSet;
>> s.put(1);
>> s.contains(1)
ans =
1
>> s.contains(2)
ans =
0
答案 1 :(得分:1)
根据您的示例的文字格式,disp
将是一个巨大的开销(I / O非常慢)。
除此之外,我认为最快捷的方式是这样做:
if find(primes==3,1,'first')
disp('yes');
else
disp('no');
end
修改,您也可以使用any(primes==3)
- 快速测试显示它们大致相同:
>> biglist = 1:100000;
>> tic;for i=1:10000
find(biglist==i,1,'first');
end
toc
Elapsed time is 1.055928 seconds.
>> tic;for i=1:10000
any(biglist==i);
end
toc
Elapsed time is 1.054392 seconds.