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

Поддерживает ли MATLAB поддержку хэш-таблиц?


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

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

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

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


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

Ответ 1

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

Ответ 2

Рассмотрим использование класса карты 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
    

Ответ 3

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

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

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

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

Ответ 4

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

В Matlab:

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

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

Ответ 5

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

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

var = 'a';

display( dict.(var) ); % prints 1

Ответ 6

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