将结构放置在地图容器中 - 或者是否有其他更合适的方法来存储此类数据?



我有一些与几个"标签"相关的数据(例如,"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,您的数据组织对我来说就像一个表。

相关内容

最新更新