访问具有相似名称的多个结构中的值

时间:2014-04-10 13:39:19

标签: matlab eval

我是Matlab的新手,并一直在努力自学。我找了一个类似的问题,但找不到一个非常正确的问题。 在我的工作区中,我有几个名称相似的结构。这些结构总是以相同的单词('Base')开头,但名称的其余部分将更改('1','2','3'),例如Base1,{{1} },Base2 ...等。这些变量是使用图中的数据光标工具生成的,因此包含字段Base3TargetPosition。我只对DataIndex中的价值感兴趣。我想从每个结构中提取这个值,就像有结构一样多次(在一个实例中可能有6个结构,另一个时间只有4个)。 我正在考虑使用eval函数,但它似乎适用于完全字符串而不仅仅是名称的第一部分。此外,许多文档似乎建议不要使用eval。 到目前为止,我有:

Base*.Position(1,1)

这是for循环我坚持,因为我不知道如何推广所以它将为每个不同的结构名称提取值.Position(1,1)。 提前致谢

2 个答案:

答案 0 :(得分:3)

而不是将许多结构称为Base1Base2等而不是将您的结构放在一个数组中。然后你可以打电话给Base(1).Position(1,1)Base(2).Position...等。这样你的代码就会更灵活,更易于管理。

所以我建议你在使用数据游标导出时,导出到一个名为Base_temp的变量,然后立即将其粘贴到数组的下一个元素中:

Base(end+1) = Base_temp

甚至:

Position(end+1) = Base_temp.Position(1,1);

然后只是在每次使用数据光标导出后按下并输入的情况。

你所了解的关于avioding eval的内容是正确的,eval是一个好主意是非常罕见的(如果有的话)。它使您的代码难以阅读并且很难调试。但是既然你正在学习,这就是你如何修复你的循环。 (但不要这样做,严重的是,不要使用数组):

for i=1:length(list_variables)
    BaseTS(i) = eval(['Base', num2str(i), '.Position(1,1)']);
end

换句话说,使用字符串连接来构建字符串并使用循环变量(i)来获取不同的数字。您需要num2str才能将数字转换为字符串。但是不要这样做。这是一个糟糕的方式。

答案 1 :(得分:0)

Dan关于避免eval的建议是非常有效的。但是如果你决定继续使用工作区中的结构,这里有一些没有循环的东西,但cellfun似乎在内部使用了循环。所以,我想这可能是另一种解决方案,而不那么受欢迎的eval -

list1 = who('Base*')
list2 = cellstr(strcat('BaseTS(',num2str([1:numel(list1)]'),')='));%%//'
ev1 = strcat(list2,list1,'.Position(1,1)');%%//'
cellfun(@evalc,ev1,'uni',0)