我是Matlab的新手,并一直在努力自学。我找了一个类似的问题,但找不到一个非常正确的问题。
在我的工作区中,我有几个名称相似的结构。这些结构总是以相同的单词('Base')开头,但名称的其余部分将更改('1','2','3'),例如Base1
,{{1} },Base2
...等。这些变量是使用图中的数据光标工具生成的,因此包含字段Base3
,Target
和Position
。我只对DataIndex
中的价值感兴趣。我想从每个结构中提取这个值,就像有结构一样多次(在一个实例中可能有6个结构,另一个时间只有4个)。
我正在考虑使用eval函数,但它似乎适用于完全字符串而不仅仅是名称的第一部分。此外,许多文档似乎建议不要使用eval。
到目前为止,我有:
Base*.Position(1,1)
这是for循环我坚持,因为我不知道如何推广所以它将为每个不同的结构名称提取值.Position(1,1)。 提前致谢
答案 0 :(得分:3)
而不是将许多结构称为Base1
,Base2
等而不是将您的结构放在一个数组中。然后你可以打电话给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)
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)