Поддерживает ли MATLAB хеш-таблицы?
Некоторый фон
Я работаю над проблемой в Matlab, которая требует представления изображения в масштабном пространстве. Для этого я создаю фильтр 2-D Gaussian с дисперсией sigma*s^k
для k
в некотором диапазоне., А затем я использую каждый в свою очередь , для фильтрации изображения. Теперь мне нужно какое-то отображение k
отфильтрованного изображения.
Если бы k
всегда было целое число, я бы просто создал трехмерный массив, такой что:
arr[k] = <image filtered with k-th guassian>
Однако k
это не обязательно целое число, поэтому я не могу этого сделать. Я думал о том, чтобы сохранить такой массив k
s, чтобы:
arr[find(array_of_ks_ = k)] = <image filtered with k-th guassian>
На первый взгляд это кажется довольно хорошим, за исключением того, что я буду выполнять этот поиск несколько тысяч раз примерно с 20 или 30 значениями k
, и я боюсь, что это повредит производительности.
Интересно, не лучше ли мне было бы делать это с какой-то хэш-таблицей, чтобы у меня было время поиска, равное O (1) вместо O (n).
Теперь я знаю, что мне не следует проводить оптимизацию преждевременно, и у меня может вообще не быть этой проблемы, но помните, что это всего лишь фон, и могут быть случаи, когда это действительно лучшее решение, независимо от того, лучшее решение моей проблемы.
Новый класс container.Map в Matlab R2008b (7.7) - это уменьшенная версия интерфейса java.util.Map для Matlab . Он имеет дополнительное преимущество - бесшовную интеграцию со всеми типами Matlab (например, Java Maps не может обрабатывать структуры Matlab ), а также возможность, начиная с Matlab 7.10 (R2010a), указывать типы данных .
Серьезные реализации Matlab, требующие карт / словарей «ключ-значение», должны по-прежнему использовать классы Java Map ( java.util.EnumMap , HashMap , TreeMap , LinkedHashMap или Hashtable ), чтобы получить доступ к их более широким функциям, если не к производительности. Версии Matlab до R2008b в любом случае не имеют реальной альтернативы и должны использовать классы Java.
Потенциальным ограничением использования коллекций Java является их неспособность содержать непримитивные типы Matlab, такие как структуры. Чтобы преодолеть это, либо преобразуйте типы с понижением (например, используя struct2cell или программно), либо создайте отдельный объект Java, который будет содержать вашу информацию и хранить этот объект в коллекции Java.
Вам также может быть интересно изучить объектно-ориентированную (основанную на классах) реализацию Hashtable на чистом Matlab, которая доступна в File Exchange .
источник
Вы можете использовать для этого java.
В Matlab:
dict = java.util.Hashtable; dict.put('a', 1); dict.put('b', 2); dict.put('c', 3); dict.get('b')
Но вам нужно будет провести некоторое профилирование, чтобы увидеть, дает ли он вам прирост скорости, я думаю ...
источник
Это немного запутанно, но я удивлен, что никто не предложил использовать структуры. Вы можете получить доступ к любому полю структуры по имени переменной, так как
struct.(var)
wherevar
может быть любой переменной и будет разрешено соответствующим образом.dict.a = 1; dict.b = 2; var = 'a'; display( dict.(var) ); % prints 1
источник
dict.('2')
:: mathworks.com/access/helpdesk/help/techdoc/matlab_prog/…dict.(['k',num2str(1)])
работает, ноdict.(['k',num2str(1.1)])
не работает, и если значения являются целыми числами, вы можете использовать их для непосредственного индексирования. В противном случае это хорошая идея..
с_
.dict.(genvarname(['k',num2str(1.1)]))
Вы также можете воспользоваться новым типом «Таблица». Вы можете хранить разные типы данных и очень легко получать из них статистику. См. Http://www.mathworks.com/help/matlab/tables.html для получения дополнительной информации.
источник