Перегрузка операторов в MATLAB для эмуляции хеш-массива - PullRequest
1 голос
/ 13 декабря 2010

Можно ли перегрузить subsref и subsasgn, чтобы разрешить нецелые типы для значения индекса?

h = Hash; #% a custom hash class to manage my data
h(100) = 'data'; #% integer is fine, if index > 0

h{'string'} #% but this fails
??? Cell contents reference from a
non-cell array object.

Можно ли как-нибудь взломать?


Точное решение:

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

classdef Hash < containers.Map
  # fun
end

В таком классе можно реализовать различные типы ключей (не только один!) И удобные методы для пользовательских операций. Также возможно переопределить subsref и subsasgn для работы с фигурными скобками и несколькими индексами. Nice!

Ответы [ 2 ]

6 голосов
/ 13 декабря 2010

Не нужно взламывать.Используйте структуру или container.Map .Это собственные структуры данных Matlab для ассоциативных массивов.Структура индексируется строками (с некоторыми ограничениями).Контейнеры. Карта может быть проиндексирована с помощью строковых, нецелых чисел или других типов данных.Смотрите "help struct" и "help container.Map".Карта использует скобки для индексации, поэтому ее синтаксис выглядит как массив, проиндексированный другими способами.

>> m = containers.Map(.1, 'myvalue');
>> m(.75) = 'anothervalue';
>> x = m(.1)
x =
myvalue
>> 
0 голосов
/ 13 декабря 2010

Почему бы просто не использовать java.util.HashMap? Matlab отлично работает с Java. (Хотя я предполагаю, что это работает только с данными, которые можно упорядочить в Java, поэтому, хотя матрицы и массивы ячеек матриц в порядке, структуры отсутствуют)

>> x = java.util.HashMap;
>> x.put(3, [1 2 3]);
>> x.put('Rosebud',[4 5 6; 7 8 9]);
>> x.put([2 4 6 8],'Michaelangelo'); 
>> x.get(3)

ans =

     1
     2
     3

>> x.get('Rosebud')

ans =

     4     5     6
     7     8     9

>> x.get([2 4 6 8])

ans =

     []

Ага: следите за этим последним битом - семантика равенства в Java для чисел и строк проста, но для массивов все становится сложнее, а использование Java в MATLAB немного похоже на обработку лабораторных образцов в перчаточном ящике.

Если вы можете справиться с ограничениями java.util.HashMap (семантика равенства ключей, ограничения типов для тех, которые могут быть распределены между Java и MATLAB), используйте его - в противном случае вам, вероятно, придется написать свой собственный.

...