温馨提示:本文翻译自stackoverflow.com,查看原文请点击:其他 - Store values from a MATLAB for loop similar to a Python dictionary

其他 - 存储来自MATLAB for循环的值,类似于Python字典

发布于 2020-03-28 23:35:46

我正在遍历文件(使用for循环),并从每个循环中获取两个值-名称和标签。如果以后要使用名称访问标签,什么是存储这些值的最佳方法?

  1. 是否有类似于python字典的内容: {'name1': tag1, 'name2': tag2, .... 'nameN': tagN}

  2. 还是应该将其存储在具有两列的表中-名称和标签

谢谢

查看更多

查看更多

提问者
anarz
被浏览
126
Wolfie 2020-01-31 18:05

听起来像你想要的 containers.Map

您可以将名称/值对存储在单元格数组中,然后将其粘贴到映射中以供以后参考

% Create loop data
N = 10;
data = cell(N,2);
for ii = 1:N 
    data{ii,1} = sprintf( 'Name%.0f', ii );
    data{ii,2} = sprintf( 'Tag%.0f', ii );
end
% Create map
m = containers.Map( data(:,1), data(:,2) );

然后,您可以通过两种方式对此进行评估

% For a single value
m( 'Name1' ) % = 'Tag1';
% For one or more values
m.values( {'Name1','Name2'} ) % = {'Tag1','Tag2'};

在这里使用映射的唯一真正优势是语法,除非您的数据特别适合采用这种结构。拥有data数组后,仅使用逻辑索引并不难

data( ismember(data(:,1), 'Name1'), 2 ) % = {'Tag1'}

您甚至可以将匿名函数作为此操作的简写形式(在定义之后data),从而省去.values了 map使用语法

f = @(str) data( ismember( data(:,1), str ), 2 );
f( 'Name1' ) % = {'Tag1'}
f( {'Name1','Name2'} ) % = {'Tag1','Tag2'}

请注意,ismember如果'NameX'找不到方法,则该方法不会引发错误,而如果键不存在,则 map将引发错误。