TL; DR: Нет. containers.Map
имеет применения, которые нельзя заменить на table
.И я бы не стал выбирать table
для словаря.
containers.Map
и table
имеют много различий, на которые стоит обратить внимание.У каждого из них есть свое применение.Третий контейнер, который мы можем использовать для создания словаря - это struct
.
Чтобы использовать table
в качестве словаря, вы должны определить только один столбец и указать имена строк:
T = table(data,'VariableNames',{'value'},'RowNames',names);
Вот некоторые заметные различия между этими контейнерами при использовании в качестве словаря:
Скорость: struct
имеет самый быстрый доступ на данный момент (10x).containers.Map
примерно в два раза быстрее, чем table
при использовании эквивалентным образом (т. Е. Таблица из одного столбца с именами строк).
Ключи: A struct
- этоограничено ключами, которые являются допустимыми именами переменных, два других могут использовать любую строку в качестве ключа.Клавиши containers.Map
также могут быть скалярными числами (с плавающей точкой или целыми числами).
Данные: все они могут содержать разнородные данные (каждое значение имеет свой тип), ноtable
меняет порядок индексации, если вы делаете это (T.value(name)
для однородных данных, T.value{name}
для разнородных данных).
Синтаксис: для поиска ключа containers.Map
предоставляетсамый простой синтаксис: M(name)
.table
, превращенный в словарь, требует бессмысленного использования имени столбца: T.value(name)
.struct
, если ключ задан содержимым переменной, выглядит немного неловко: S.(name)
.
Конструкция: (см. Код ниже.) containers.Map
имеет самый простой метод для создания словаря на основе данных.struct
не предназначен для этой цели, и поэтому он становится сложным.
Память: это трудно сравнивать, так как containers.Map
реализован в Java и, следовательно, whos
сообщает только 8 байтов (т.е. указатель).table
может быть более эффективным с точки зрения памяти, чем struct
, если данные однородны (все значения имеют одинаковый тип) и скалярны, так как в этом случае все значения для одного столбца хранятся водин массив.
Другие отличия:
A table
, очевидно, может содержать несколько столбцов и имеет множество интересных методов для манипулирования данными.
A stuct
на самом деле является массивом структур и может быть проиндексирован как S(i,j).(name)
.Конечно, name
может быть фиксированной, а не переменной, что приводит к S(i,j).name
.Из трех, это единственный встроенный тип, поэтому он намного эффективнее.
Вот код, который показывает разницумежду этими тремя контейнерами для создания словаря и поиска значения:
% Create names
names = cell(1,100);
for ii=1:numel(names)
names{ii} = char(randi(+'az',1,20));
end
name = names{1};
% Create data
values = rand(1,numel(names));
% Construct
M = containers.Map(names,values);
T = table(values.','VariableNames',{'value'},'RowNames',names);
S = num2cell(values);
S = [names;S];
S = struct(S{:});
% Lookup
M(name)
T.value(name)
S.(name)
% Timing lookup
timeit(@()M(name))
timeit(@()T.value(name))
timeit(@()S.(name))
Результаты синхронизации (микросекунды):
M: 16.672
T: 23.393
S: 2.609