16

可能重复:
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()anddict()或类似的 Java 的java.util.HashSetand等价的东西?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 集的构建也很慢,因此根据问题的不同,这也可能很慢。真的很高兴容器。地图提示。它真的破坏了其他例子,而且它也是即时设置的。

4

2 回答 2

20

像这样?

>> m = java.util.HashMap;
>> m.put(1,'hello,world');
>> m.get(1)
ans =
hello, world

或者,如果您想要 Matlab-native 实现,请尝试

>> m = containers.Map;
>> m('one') = 1;
>> m('one')
ans =
     1

这实际上是键入的——它接受的唯一键是 type char。您可以在创建映射时指定键和值类型:

>> m =  containers.Map('KeyType','int32','ValueType','double');
>> m(1) = 3.14;
>> m(1)
ans =
  3.14

如果您尝试输入除 a 之外的任何键int32和除 a 之外的任何值,您现在将得到错误double

您还可以使用 Set:

>> s = java.util.HashSet;
>> s.put(1);
>> s.contains(1)
ans = 
     1
>> s.contains(2)
ans = 
     0
于 2012-09-27T16:18:56.870 回答
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.
于 2012-09-27T16:16:37.810 回答