1

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

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

4

3 回答 3

1

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

例如,

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

会给你一个mydata带有字段的结构test001

然后,您可以稍后将您的x, y,z字段添加到此。

您可以稍后使用 bymydata.test001.x或 by的字段mydata.(casename(12:18)).x

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

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

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

于 2013-06-12T10:12:42.917 回答
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 = ...
于 2013-06-12T10:08:46.723 回答
-2

使用评估:

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

编辑:抱歉,忘记了 sprintf。

于 2013-06-12T09:51:21.190 回答