Использование MATLAB Map Containers без предварительного преобразования в массивы ячеек - PullRequest
2 голосов
/ 08 марта 2012

Допустим, у меня есть два следующих массива:

keys   = uint32([1:100])';
values = uint32([100:-1:1])';

Я могу определить контейнер карты следующим образом:

newMap = containers.Map(keys,values);

newMap = 
  containers.Map handle
  Package: containers

  Properties:
        Count: 100
      KeyType: 'uint32'
    ValueType: 'uint32'
  Methods, Events, Superclasses

Тип одинаков для ключей и значений, uint32.

Однако, если я хочу использовать контейнер для сопоставления нового массива:

other_keys = uint32([5 9 10]);

Я прочитал в документации, я должен сначала преобразовать other_keys в массив ячеек:

>> newMap(other_keys)
Error using containers.Map/subsref
Specified key type does not match the type expected
for this container.

или:

values(newMap, other_keys);

Error using subsindex
Function 'subsindex' is not defined for values of
class 'containers.Map'.

Единственный способ заставить его работать с:

values(newMap, num2cell(other_keys));

, который может занять длительное время и много памяти !Например, если у меня 100 миллионов номеров, я получаю:

tic
my_uint32_array = uint32(1:100000000)
my_cell_array   = num2cell(my_uint32_array);
toc

Elapsed time is 27.956496 seconds.

, где:

  • my_uint32_array имеет размер 381.5 MB
  • my_cell array имеет размер 10.8GB ( 100x раз больше!, хотя это всего лишь временная переменная, поскольку я всего лишь заинтересован в отображении моих значений в конце концов)

Учитывая, что я могу создавать Сопоставлять контейнеры без необходимости сначала преобразовывать их в массивы ячеек, есть ли способ использовать их без необходимости сначала преобразовывать мои ключи в массивы ячеек?

1 Ответ

2 голосов
/ 08 марта 2012

Подожди, я не понимаю.Код

values(newMap, num2cell(other_keys));

, эквивалентный

newMap.values(num2cell(other_keys));

, будет работать только в том случае, если ваши ключи представляют собой массив 1:N.В противном случае вы не принимаете правильные значения.Но если ключи представляют собой массив 1:N, вы не должны использовать Map.Вы можете просто определить массив uint32.

Если вы имели в виду, что хотите сделать что-то подобное:

for key=other_keys
   vals(end+1) = newMap(key);
end

, вы также можете попробовать выполнить следующую векторизацию:

vals = arrayfun( @(x)(newMap(x)),other_keys);

Хотя яне уверен, что он будет работать быстрее.

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