Убирают ли таблицы MATLAB необходимость использования словарей? - PullRequest
0 голосов
/ 30 декабря 2018

MATLAB table s позволяет индексировать любой столбец / поле, используя имя строки, например, MyTable.FourthColumn('SecondRowName').По сравнению с этим словари (containers.Map) кажутся примитивными, например, они выполняют роль таблицы из 1 столбца.Он также имеет собственный выделенный синтаксис, который замедляет процесс кодирования.

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

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

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
0 голосов
/ 30 декабря 2018

Вы можете пойти проще, вы можете получить доступ к структурам, используя строковое поле:

clear
% define
mydata.('vec')=[2 4 1]; 
mydata.num=12.58;
% get 
select1='num'; 
value1=mydata.(select1); %method 1 
select2='vec'; 
value2=getfield(mydata,select2) %method 2 
...