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

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

86 голосов
/ 28 августа 2010

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


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

Я работаю над проблемой в Matlab, которая требует масштабного представления изображения. Для этого я создаю 2-D фильтр Гаусса с дисперсией 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).


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

Ответы [ 6 ]

117 голосов
/ 28 августа 2010

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

  • Создание:

    >> keys = {'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', ...
      'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec', 'Annual'};
    
    >> values = {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 = containers.Map(keys, values)
    
    rainfallMap = 
      containers.Map handle
      Package: containers
    
      Properties:
            Count: 13
          KeyType: 'char'
        ValueType: 'double'
      Methods, Events, Superclasses
    
  • Поиск:

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

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

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

    rainfallMap.remove('Total')
    
  • Проверьте:

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

    if rainfallMap.isKey('Today')
        ...
    end
    
25 голосов
/ 29 августа 2010

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

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

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

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

18 голосов
/ 28 августа 2010

Вы можете использовать для этого Java.

В матлабе:

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

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

14 голосов
/ 28 августа 2010

Matlab не поддерживает хеш-таблицы. РЕДАКТИРОВАТЬ До r2010a, то есть;см. ответ @ Amro .

Чтобы ускорить поиск, вы можете опустить find и использовать ЛОГИЧЕСКАЯ ИНДЕКСАЦИЯ .

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

12 голосов
/ 28 августа 2010

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

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

var = 'a';

display( dict.(var) ); % prints 1
1 голос
/ 14 ноября 2014

Вы также можете воспользоваться новым типом «Таблица».Вы можете хранить различные типы данных и получать статистику из них очень легко.См. http://www.mathworks.com/help/matlab/tables.html для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...