Хеш-таблицы в MATLAB

Имеет ли MATLAB какую-либо поддержку хеш-таблиц?


Некоторый фон

Я работаю над проблемой в Matlab, которая требует масштабного представления пространства изображение. Для этого я создаю двумерный гауссов фильтр с дисперсией sigma * s ^ k для k в некотором диапазоне, а затем использую каждый из них по очереди для фильтрации изображения. Сейчас, Мне нужно какое-то отображение из k в отфильтрованное изображение.

Если бы k всегда были целыми числами, я бы просто создал трехмерный массив такой, что:

arr[k] = <image filtered with k-th guassian>

Однако , k не обязательно является целым числом, поэтому я не могу этого сделать. Я думал о том, чтобы сохранить массив k с таким значением:

arr[find(array_of_ks_ = k)] = <image filtered with k-th guassian>

На первый взгляд это кажется довольно хорошим, за исключением того, что я буду выполнять этот поиск потенциально несколько тысяч раз с примерно 20 или 30 значениями. из k , и я боюсь, что это повредит производительности.

Интересно, не лучше ли мне сделать это с какой-нибудь хэш-таблицей, чтобы у меня было время поиска O (1) вместо O (n).


Теперь я знаю что я не должен оптимизировать преждевременно, и у меня может вообще не быть этой проблемы, но помните, это всего лишь фон, и могут быть случаи, когда это действительно лучшее решение, независимо от того, является ли оно лучшим решением для моей проблемы.

89
задан Matthew Simoneau 10 May 2011 в 20:52
поделиться

5 ответов

Matlab не поддерживает хеш-таблицы. EDIT До r2010a, то есть; см. ответ @Amro.

Чтобы ускорить поиск, вы можете отказаться от найти и использовать ЛОГИЧЕСКОЕ ИНДЕКСИРОВАНИЕ.

arr{array_of_ks==k} = <image filtered with k-th Gaussian>

или

arr(:,:,array_of_ks==k) = <image filtered with k-th Gaussian>

Однако, за весь мой опыт работы с Matlab, я никогда ни разу не видел, чтобы поиск был узким местом.


Чтобы ускорить вашу конкретную проблему, я предлагаю либо использовать инкрементную фильтрацию

arr{i} = GaussFilter(arr{i-1},sigma*s^(array_of_ks(i)) - sigma*s^(array_of_ks(i-1)))

, предполагая, что array_of_ks отсортирован в порядке возрастания, а GaussFilter вычисляет размер маски фильтра на основе дисперсии (и использует, 2 1D-фильтры, конечно), или вы можете фильтровать в пространстве Фурье, что особенно полезно для больших изображений и если дисперсии распределены равномерно (что, к сожалению, скорее всего, не так).

14
ответ дан 24 November 2019 в 07:16
поделиться

Это немного неуклюже, но я удивлен, что никто не предложил использовать структуры. Вы можете получить доступ к любому полю структуры по имени переменной как struct.(var), где var может быть любой переменной и будет разрешено соответствующим образом.

dict.a = 1;
dict.b = 2;

var = 'a';

display( dict.(var) ); % prints 1
12
ответ дан 24 November 2019 в 07:16
поделиться

Рассмотрите возможность использования класса карты MATLAB: containers.Map. Вот краткий обзор:

  • Создание:

     >> keys = {'Янв', 'Фев', 'Мар', 'Апр', 'Май', 'Июнь', ...
     'июль', 'август', 'сен', 'октябрь', 'ноябрь', 'декабрь', 'годовой'};
    
    >> значения = {327,2, 368,2, 197,6, 178,4, 100,0, 69,9, ...
    32,3, 37,3, 19,0, 37,0, 73,2, 110,9, 1551,0};
    
    >> rainfallMap = container.Map(ключи, значения)
    Карта осадков =
    дескриптор container.Map
    Пакет: контейнеры
    
    Характеристики:
    Количество: 13
    Тип ключа: 'символ'
    Тип значения: "двойной"
    Методы, события, суперклассы
     
  • Поиск:

     x = rainfallMap('Jan');
     
  • Присвоить:

     rainfallMap('Jan') = 0;
     
  • Добавить:

     rainfallMap('Total') = 999;
     
  • Удалить:

     rainfallMap.remove('Всего')
     
  • Проверка:

     values ​​= rainfallMap.values;
    ключи = rainfallMap.keys;
    sz = rainfallMap.size;
     
  • Проверить ключ:

     if rainfallMap.isKey('Сегодня')
     ...
    конец
     
118
ответ дан 24 November 2019 в 07:16
поделиться

Новые контейнеры Matlab R2008b (7.7). Класс Map представляет собой уменьшенную версию Matlab интерфейса java.util.Map. Он имеет дополнительное преимущество бесшовной интеграции со всеми типами Matlab (например,Java Maps не может обрабатывать структуры Matlab), а также возможность начиная с Matlab 7.10 (R2010a) указывать типы данных.

Серьезные реализации Matlab, требующие карт/словарей ключ-значение, должны по-прежнему использовать классы Map Java (java.util.EnumMap, HashMap, TreeMap, . ]LinkedHashMap или Hashtable), чтобы получить доступ к их большей функциональности, если не к производительности. Версии Matlab до R2008b в любом случае не имеют реальной альтернативы и должны использовать классы Java.

Потенциальным ограничением использования коллекций Java является их неспособность содержать непримитивные типы Matlab, такие как структуры. Чтобы преодолеть это, либо преобразуйте типы с понижением (например, с помощью struct2cell или программно), либо создайте отдельный объект Java, который будет содержать вашу информацию и сохранит этот объект в коллекции Java.

Вам также может быть интересно изучить чисто объектно-ориентированную (на основе классов) реализацию Hashtable в Matlab, которая доступна на File Exchange.

25
ответ дан 24 November 2019 в 07:16
поделиться

Для этого можно использовать Java.

В Matlab:

dict = java.util.Hashtable;
dict.put('a', 1);
dict.put('b', 2);
dict.put('c', 3);
dict.get('b')

Но вам нужно будет сделать некоторое профилирование, чтобы увидеть, дает ли это вам прирост скорости, я думаю...

18
ответ дан 24 November 2019 в 07:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: