【问题标题】:Matlab: dynamic name for structureMatlab:结构的动态名称
【发布时间】:2013-06-12 09:46:12
【问题描述】:

我想在 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 生成动态名称的方法。

我希望有人能理解我写的内容 :) 我查看了常见问题解答和 Google,但我找不到相同的问题。

【问题讨论】:

  • 如果您有 100 个测试怎么办?你会硬编码plot(test001.x, ..., test100.y) 吗?相反,使用单元格数组或结构,例如s.test001.data 或更好的矩阵,如果长度一致。
  • 请记住,您甚至可以对您接受的答案 ;-) 或其他您认为有用的答案进行投票

标签: matlab variables struct definition


【解决方案1】:

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

例如,

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

会给你一个结构 mydata 和一个字段 test001

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

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

如果可能的话,尽量不要使用eval,正如另一个答案所暗示的那样。它使调试变得非常困难,并且那里给出的示例直接evals用户输入:

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

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

【讨论】:

  • 我会采用这个解决方案。我没想过要根据动态名称测试字段并在之后添加字段。谢谢,我几乎放弃了我的想法。
  • @Lalylulelo,如果答案解决了您的问题,请使用左侧的勾选按钮将其标记为已接受,因为它可以帮助其他用户在遇到类似问题时找到答案。跨度>
【解决方案2】:

正如我已经评论过的,最佳情况是当您的所有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 = ...

【讨论】:

  • 正如我为另一个答案所写的那样,动态字段名称的想法肯定会奏效。谢谢你,为你解答。而且我永远不会使用 eval() !
【解决方案3】:

使用评估:

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

编辑:抱歉,忘记了 sprintf。

【讨论】:

  • 我将永远反对将变量弹出到工作区的eval() 解决方案。
  • 因为它不安全?是的,但它是对问题的有效答案。当然,有比所要求的更好的方法来做到这一点。
  • 不,只是因为没有经验的用户倾向于滥用eval()。他们习惯了错误的数据管理实践(编程方法),最终将他们带回论坛提出难以理解和非建设性的问题。因此,我对eval() 的否决倾向于在用户在其上深入构建脚本之前警告不要使用此类方法。根据我对 OP 的评论,在评估了这样一个结构之后,下一步是评估 plot() 命令等等。
  • 很公平,我同意这一切。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-27
  • 1970-01-01
  • 2011-11-27
  • 1970-01-01
  • 1970-01-01
  • 2014-11-11
相关资源
最近更新 更多