我有一些与几个"标签"相关的数据(例如,"Jan","Feb","Mar"(,对于这些标签中的每一个,都有多种数据类型(数字数组,字符串,日期时间等(。
我想通过指定标签本身来访问数据,这样我就不必跟踪任何整数索引。我最近发现了 Matlab 地图容器,并尝试在这种情况下通过使用我的"标签"作为映射中的键来实现它:
keys = {'Jan','Feb','Mar'};
data_map = containers.Map('KeyType','char','ValueType','any');
% loop over keys and put some data in the map
for k = 1:length(keys)
data_struct.prices = rand(1,5); % create some dummy numbers
data_struct.description = 'HIGH'; % create a dummy label
% place the structure in the map at the relevant key
data_map(keys{k}) = data_struct;
% delete ready for next iteration of the loop
clear data_struct
end
这工作正常,因为
结构对象能够毫无问题地处理所有不同的数据类型
我可以使用
data_map('Feb')
非常紧凑和很好地访问我的数据,而无需任何整数 这会产生:
struct with fields:
prices: [0.9063 0.8797 0.8178 0.2607 0.5944]
description: 'HIGH'
或产生data_map('Feb').description
:'HIGH'
。
我的问题
1(我觉得我没有以正确的方式使用它,因为我不得不在循环内使用data_struct
临时结构。
2(此外,稍后我想在与其中一个键关联的结构中添加一个额外的字段,理想情况下会做如下事情:
data_map('Feb').temperature = rand(1,8);
这将给出以下错误:"容器只支持一个级别的索引。地图。
我能够做到这一点的唯一方法是创建一个临时结构,它既丑陋又麻烦:
temp_struct = data_map('Feb');
temp_struct.temperature = rand(1,8);
data_map('Feb') = temp_struct;
clear temp_struct
disp( data_map('Feb').temperature )
有没有更好的方法来存储这种类型的数据?
对于您的第一个问题,您可以简化如下:
keys = {'Jan','Feb','Mar'};
data_map = containers.Map('KeyType','char','ValueType','any');
n = size(keys,2);
% loop over keys and put some data in the map
for k = 1:n
data_map(keys{k}) = struct('prices',rand(1,5),'description','HIGH');
end
对于第二个问题,您可以使用:
setfield(data_map('Feb'),'temperature',rand(1,5))
containers.Map
有一些不错的属性,但我认为你没有使用这些属性。你不妨使用一个简单的结构。
您可以使用
data_map.Feb
data_map.('Feb')
data_map.Feb.description
data_map.('Feb').description
这将解决您的两个问题:
循环内部:
data_map.(keys{k}).prices = rand(1,5);
data_map.(keys{k}).description = 'HIGH';
之后:
data_map.Feb.temperature = rand(1,8);
还考虑使用table
,您的数据组织对我来说就像一个表。