Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there any way to use hashtables/hashmaps in matlab? [duplicate]

Possible Duplicate:
Hash tables in MATLAB

General Question

Is there any way to get a hashset or hashmap structure in Matlab?

I often find myself in situations where I need to find unique entries or check membership in vectors and using commands like unique() or logical indexing seems to search through the vectors and is really slow for large sets of values. What is the best way to do this in Matlab?

Example

Say, for example, that I have a list of primes and want to check if 3 is prime:

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

if primes(primes==3)
    disp('yes!')
else
    disp('no!')
end

if I do this with long vectors and many times things get really slow.

In other languages

So basically, is there any equivalents to python's set() and dict(), or similarly Java's java.util.HashSet and java.util.HashMap, in Matlab? And if not, is there any good way of doing lookups in large vectors?

Edit: reflection on the answers

This is the running time i got on the suggestions in the answers.

>> 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

The construction of the java set was quite slow as well though so depending on the problem this might be quite slow as well. Really glad about the containers.Map tip. It really destroys the other examples, and it was instant in set up too.

like image 255
while Avatar asked Sep 27 '12 16:09

while


People also ask

Are HashMaps and Hashtables the same?

The HashMap class is roughly equivalent to Hashtable , except that it is non synchronized and permits nulls. ( HashMap allows null values as key and value whereas Hashtable doesn't allow null s). HashMap does not guarantee that the order of the map will remain constant over time.

Are HashMaps Hashtables?

HashMap is non-syncronized and is not thread safe while HashTable is thread safe and is synchronized. HashMap allows one null key and values can be null whereas HashTable doesn't allow null key or value. HashMap is faster than HashTable.

Are HashMaps efficient?

HashMap, being a hashtable-based implementation, internally uses an array-based data structure to organize its elements according to the hash function. HashMap provides expected constant-time performance O(1) for most operations like add(), remove() and contains(). Therefore, it's significantly faster than a TreeMap.

How do HashMaps resize?

As you again are likely aware, the HashMaps are resized dynamically during runtime, based on the number of entries in the map. By default, the HashMaps uses a load factor of 75%.


2 Answers

Like this?

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

Alternatively, if you want a Matlab-native implementation, try

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

This is actually typed - the only keys it will accept are those of type char. You can specify the key and value type when you create the map:

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

You will now get errors if you try to put any key other than an int32 and any value other than a double.

You also have Sets available to you:

>> s = java.util.HashSet;
>> s.put(1);
>> s.contains(1)
ans = 
     1
>> s.contains(2)
ans = 
     0
like image 82
Chris Taylor Avatar answered Oct 23 '22 03:10

Chris Taylor


Depending on how literal your example is, the disp will be a massive overhead (I/O is very slow).

That aside, I believe the quickest way to do a check like this is:

if find(primes==3,1,'first')
    disp('yes');
else
    disp('no');
end

Edit, you could also use any(primes==3) - a quick speed test shows they're approximately equivalent:

>> 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.
like image 44
n00dle Avatar answered Oct 23 '22 03:10

n00dle