Есть ли двунаправленная карта в Matlab?

Существует ли двунаправленная структура данных карты в Matlab, которая более эффективна, чем использование ключей и значений container.Map в противоположном направлении? И как наиболее эффективно использовать обычные карты для этой цели?


person Dandelion    schedule 01.03.2015    source источник
comment
Какие данные вы хотите хранить?   -  person knedlsepp    schedule 01.03.2015
comment
Сопоставление целых чисел   -  person Dandelion    schedule 01.03.2015
comment
Пожалуйста, добавьте примеры данных к вашему вопросу. Также сообщите нам, как часто вы собираетесь вставлять новые данные или удалять данные в свою двунаправленную карту. Разные решения будут показывать разную эффективность для разных вариантов использования. Для положительных целых чисел вы можете попробовать sparse.   -  person knedlsepp    schedule 01.03.2015
comment
Это общий вопрос, и двунаправленные карты являются хорошо известными структурами.   -  person Dandelion    schedule 01.03.2015
comment
Если вам нужно наиболее общее решение, вы не получите наиболее эффективное решение для своего варианта использования.   -  person knedlsepp    schedule 01.03.2015


Ответы (1)


Класс containers.Map изначально не поддерживает двунаправленное сопоставление (начиная с R2014b). Поддерживаемые методы перечислены в doc containers.Map:

  • isKey: определить, содержит ли объект containers.Map ключ
  • keys: Определить ключи объекта containers.Map
  • length: Длина объекта containers.Map
  • remove: удалить пары "ключ-значение" из объекта containers.Map.
  • size: Размер объекта containers.Map
  • values: определить значения в объекте containers.Map

Вы можете реализовать эту функциональность самостоятельно, создав

inverse = containers.Map(original.values, original.keys)

Или используйте Map2, предоставленный Микко Леппянен на файловом обмене:

[...] Также поддерживается двунаправленное использование пар ключ-значение (например, библиотека Boost.Bimap).


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

map = sparse(keys, 1, values);
inverseMap = sparse(nonzeros(map), 1, find(map))
person knedlsepp    schedule 01.03.2015
comment
Означает ли это, что нет встроенной реализации? - person Dandelion; 01.03.2015
comment
@Vasei: Нет, встроенной двунаправленной карты нет. Я добавил дополнительную информацию. - person knedlsepp; 01.03.2015