Подтвердить что ты не робот

Есть ли способ использовать hashtables/hashmaps в matlab?

Возможный дубликат:
Хэш-таблицы в MATLAB

Общий вопрос

Есть ли способ получить структуру hashset или hashmap в Matlab?

Я часто нахожусь в ситуациях, когда мне нужно найти уникальные записи или проверить принадлежность к векторам и использовать команды типа unique(), или, по-видимому, логическая индексация выполняет поиск по векторам и очень медленна для больших наборов значений. Каков наилучший способ сделать это в Matlab?

Пример

Скажем, например, что у меня есть список простых чисел и вы хотите проверить, является ли 3 простым:

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

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

если я делаю это с длинными векторами, и много раз все становится очень медленным.

В других языках

В принципе, существуют ли какие-либо эквиваленты для python set() и dict(), или аналогично Java java.util.HashSet и java.util.HashMap, в Matlab? А если нет, есть ли хороший способ делать поиск в больших векторах?

Изменить: отражение ответов

Это время, которое я получил от предложений в ответах.

>> 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-набора была довольно медленной, хотя в зависимости от проблемы это могло быть довольно медленным. Очень рад о контейнерах. Это действительно разрушает другие примеры, и это было мгновенно в настройке тоже.

4b9b3361

Ответ 1

Как это?

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

На самом деле это типизировано - единственными ключами, которые он примет, являются те, которые имеют тип 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

Ответ 2

В зависимости от того, насколько буквален ваш пример, disp будет значительным накладным расходами (ввод/вывод выполняется очень медленно).

В стороне, я считаю, что самый быстрый способ сделать проверку, как это:

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.