File Exchange

image thumbnail

RolandRitt/Matlab-NestedMap

version 1.4.0.0 (13.7 KB) by Roland
MapNested is a subclass from 'containers.map' which implements nested maps (easy multi-key access)

5 Downloads

Updated 08 Jul 2017

GitHub view license on GitHub

Matlab-NestedMap
Matlab implementation for nested maps (map of maps). This class implements easy set and get access for multible keys. The syntax is the following: Generate a new MapNested object:
NMapobj = MapNested(); %generate a new object
Write values to the Map (2 possibilites):

%possibility 1 syntax:
NMapobj('key1', 'key2', 'key3') = 10; %assign value 10 to the keyList
NMapobj({'key1', 'key2', 'key4'}) = 5; %assign value 5 using a cell array for the keyList

%possibility 2 - use the 'setValueNested' function
NMapobj = setValueNested(NMapobj, {key1, key2, key3}, 10);
NMapobj = setValueNested(NMapobj, {key1, key2, key4}, 5);
Retrieve values from the Map (2 possibilites):

%possibility 1:
value1 = NMapobj(key1, key2, key3); %returns '10'
value2 = NMapobj({key1, key2, key4}); %return '5'

%possibility 2 - using 'getValueNested' - function
value1 = getValueNested(NMapobj ,{key1, key2, key3}); %returns '10'
value2 = getValueNested(NMapobj ,{key1, key2, key4}); %returns '5'
Call superclass Methods (see containers.Map: eg isKey, keys, length, remove, size, values):

NMapobj.superclassMethod()
Retrieve properties (see containers.Map: eg. Count, KeyType, ValueType):

NMapobj.property
Delete Entries:

NMapobj('Key') = [];
remove(NMapobj, 'Key');
This function is a subclass from Matlabs 'containers.map'-class:

ATTENTION: Cell-arrays can not be assigned to the map

NMapobj('key1', 'key2', 'key3') = {'a', 'cell', 'array'}; %throws error see: https://github.com/RolandRitt/Matlab-NestedMap

Cite As

Roland (2019). RolandRitt/Matlab-NestedMap (https://www.github.com/RolandRitt/Matlab-NestedMap), GitHub. Retrieved .

Comments and Ratings (5)

I am loving the ability to have a map with multiple keys. However, I'm confused about using accessing the keys and values. With a basic container.Map, I get a list of actual keys or actual values when I use mymap.keys. However, I get a struct with no useful information when my map is a NestedMap.

Memto

Some more links, it seems that you need to go through some loops to reproduce default behavior in the cases you don't want to modify.
For example you might expose private properties and methods if you don't put checks for those. Not that i would care about that in this instance.

http://www.mathworks.co.uk/matlabcentral/answers/16652-overriding-subsref-and-subsasgn-effect-on-private-properties
http://mathworks.com/matlabcentral/newsreader/view_thread/319995
https://mathworks.com/matlabcentral/answers/98647-how-do-i-use-the-subsref-function-to-behave-as-the-builtin-only-for-a-subset-of-subscripted-referenc

Memto

Otherwise I wouldn't mind, but I'd like to be able to call foo.values or foo.keys (without arguments).

Memto

Take a look at
https://mathworks.com/help/matlab/matlab_oop/code-patterns-for-subsref-and-subsasgn-methods.html

disallowing . indexing for example hides inherited methods from map, like values, count and keys.

Updates

1.4.0.0

implemented 'isKey' method, to enable if a nested key is in the map, eg,:
*) M.isKey({Key1, Key2, Key3})
*) M.isKey(Key1, Key2, Key3)

1.3.0.0

remove entries by assinging empty array implemented:

1.2.0.0

Add '.' subsref for calling superclass-methods and properties

1.1.0.0

changed the class descripion and extended the test file

MATLAB Release Compatibility
Created with R2016b
Compatible with any release
Platform Compatibility
Windows macOS Linux