Matlab:结构的动态名称

时间:2013-06-12 09:46:12

标签: matlab variables struct definition

我想在matlab脚本中创建一个带有变量名的结构。我们的想法是提取用户填充的输入字符串的一部分,并创建具有此名称的结构。例如:

CompleteCaseName = input('s');
USER WRITES '2013-06-12_test001_blabla';  
CompleteCaseName = '2013-06-12_test001_blabla'
casename(12:18) = struct('x','y','z');

在此示例中, casename(12:18)为我提供了结果 test001

我想这样做是为了让我通过连续导入每个案例的结果来轻松比较两个案例。所以我可以写一下,例如:

plot(test001.x,test001.y,test002.x,test002.y);

问题是 casename(12:18)= struct('x','y','z'); 行对于Matlab无效,因为它让我将一个字符串更改为结构。我在struct中找到的所有示例都基于像

这样的定义
S = struct('x','y','z');

我无法找到基于字符串为 S 创建动态名称的方法。

我希望有人理解我写的内容:)我查看了常见问题解答和谷歌,但我无法找到同样的问题。

3 个答案:

答案 0 :(得分:1)

使用具有动态字段名称的结构。

例如,

mydata.(casename(12:18)) = struct;

会为您提供一个字段为mydata的结构test001

然后,您可以稍后将xyz字段添加到此。

您可以稍后按mydata.test001.xmydata.(casename(12:18)).x使用这些字段。

如果可能的话,尽量避免使用eval,如另一个答案所示。这使得调试非常困难,并且在那里给出了直接eval用户输入的示例:

eval('%s = struct(''x'',''y'',''z'');',casename(12:18));

甚至是安全风险 - 如果用户输入所选字符为system(''rm -r /''); a的字符串,会发生什么?有点不好,就是这样。

答案 1 :(得分:0)

正如我已经评论过的,最佳案例是指所有xy向量的长度相同。在这种情况下,您可以将来自不同文件的所有数据存储到2个矩阵中,并调用plot(x,y)将每列绘制成一个系列。

或者,您可以使用单元格数组,以便:

c = cell(2,nufiles);
for ii = 1:numfiles
     c{1,ii} = import x data from file ii
     c{2,ii} = import y data from file ii
end
plot(c{:})

结构,另一方面

s.('test001').x = ...
s.('test001').y = ...

答案 2 :(得分:-2)

使用eval:

eval(sprintf('%s = struct(''x'',''y'',''z'');',casename(12:18)));

编辑:道歉,忘记了sprintf。