Хэш-таблицы в MATLAB
есть ли у MATLAB поддержка хэш-таблиц?
какой-то фон
Я работаю над проблемой в Matlab, которая требует масштабно-пространственного представления изображения. Для этого я создаю 2-D гауссовский фильтр с дисперсией sigma*s^k
на k
в некотором диапазоне., а затем я использую каждый из них по очереди, чтобы отфильтровать изображение. Теперь я хочу какое-то отображение от k
к отфильтрованному изображению.
если k
всегда были целым числом, я бы просто создайте 3D массив такой, что:
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
, и я боюсь, что это повредит производительности.
интересно, если бы я не был бы лучше служить делать это с a хэш-таблица какого-то рода, чтобы у меня было время поиска, которое равно O(1) вместо O(n).
теперь я знаю, что я не должен оптимизировать преждевременно, и у меня может не быть этой проблемы вообще, но помните, что это всего лишь фон, и могут быть случаи, когда это действительно лучшее решение, независимо от того, является ли это лучшим решением для мой.
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 для получения дополнительной информации.