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


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


какой-то фон

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

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

arr[k] = <image filtered with k-th guassian>
, k не обязательно целое число, поэтому я не могу этого сделать. То, что я думал сделать, это сохранить массив ks, такие, что:
arr[find(array_of_ks_ = k)] = <image filtered with k-th guassian>

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

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


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

6 84

6 ответов:

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

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

  • создание:

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

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

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

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

вы также можете быть заинтересованы в изучении чистой среде MATLAB объектно-ориентированная (на основе классов) хеш-таблица реализация, которая составляет доступно на файлообменнике.

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

в matlab:

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

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

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

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

var = 'a';

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

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