用字符串创建变量名

17

假设我想要创建10个变量,它们的样子会是这样:

x1 = 1;
x2 = 2;
x3 = 3;
x4 = 4;
.
.
xi = i;
这是我打算做的事情的简化版本。基本上,我只想通过以自动化方式创建这些变量来保存代码行。在Matlab中有构建变量名的可能性吗?我的示例中模式将是["x", num2str(i)]。但我找不到创建具有该名称的变量的方法。
这是我打算做的事情的简化版本。基本上,我只想通过以自动化方式创建这些变量来保存代码行。在Matlab中有构建变量名的可能性吗?我的示例中模式将是["x", num2str(i)]。但我找不到创建具有该名称的变量的方法。

3
请参见MATLAB常见问题解答:如何在循环中创建变量A1,A2,...,A10? - Amro
6个回答

28

你可以使用eval来完成,但你真的不应该这样做

eval(['x', num2str(i), ' = ', num2str(i)]); %//Not recommended

最好使用一个单元数组:

x{i} = i

13
我真的不建议您使用eval在工作区中弹出增量变量。如果您想要一个名称,请创建一个结构体: s.(sprintf('x%d', i)) = i; - Oleg
为什么不推荐这样做? - Charlie Parker
2
@CharlieParker 这会让你的代码难以阅读(只需比较我的两个解决方案),并且强制你再次使用eval来迭代你的变量,这是不必要的复杂。它使你的代码非常难以调试,并增加了更多的错误空间。想想如何在两个解决方案中找到最大的x,这就是如果你使用eval会变得多么复杂的一个例子!此外,它会用所有那些你不需要的变量来混乱你的工作区。这就是数组存在的原因!这是一种懒惰、草率的编码方式,表明你没有花时间进行适当的规划。 - Dan
1
@CharlieParker eval 也相对较慢,因为优化器无法知道它将要执行什么操作。 - pattivacek
@Dan暂时不方便,但这个想法直接来自源头:http://www.mathworks.com/help/matlab/matlab_prog/string-evaluation.html#bs7kmd5 - pattivacek
显示剩余2条评论

5

我强烈建议在这种情况下使用单元数组或结构体。我认为这甚至会给你带来一些性能提升。

如果你确实需要这样做,那么Dan告诉了你如何操作。但我还想指出genvarname函数。它将确保您的字符串是有效的变量名。

编辑:genvarname是Matlab核心部分而不是统计工具箱的一部分。


谢谢。我将使用数组而不是单元格。我问题中的示例只是为了提供一个简单的问题,以获取我正在寻找的信息。实际上,我所做的并不像我的问题那样幼稚 :p - Potaito
@bdecaf:顺便说一下,genvarname是MATLAB核心的一部分。 - Amro
哦,我的错。我本来以为它是那个工具箱的一部分。 - bdecaf

4
for k=1:10
   assignin('base', ['x' num2str(k)], k)
end

建议将“base”更改为“caller”。这样,根据我的理解,它应该可以在任何地方工作,而不需要特别注意工作区。 - Flyto

2
尽管有些晚了,我还是想再添加一个答案。
genvarname函数正好可以解决这些情况,并且如果你使用它与tmp结构数组一起使用,你就不需要eval命令。
这个链接中的示例4展示了如何做到这一点:http://www.mathworks.co.uk/help/matlab/ref/genvarname.html
 for k = 1:5
   t = clock;
   pause(uint8(rand * 10));
   v = genvarname('time_elapsed', who);
   eval([v ' = etime(clock,t)'])
   end

all the best

eyal


1
如果有其他人感兴趣,从丹的回答中正确的语法应该是:
eval(['x', num2str(i), ' = ', num2str(i)]);

我的问题中已经包含了错误的语法,所以这是我的错。


3
未来,如果有类似这样的小错误,你可以编辑我的答案。底部有一个编辑链接。如果你的声望不够高,你也可以留下评论,其他人会为你做出修改。我已经改正了我的错误 ;) - Dan

0

我需要这样的东西,因为如果您想在模拟期间更改它们,则无法从Simulink块中的工作区引用结构(或单元数组,我认为)。

无论如何,对我来说,这是最好的解决方案

assignin('base',['string' 'parts'],values);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接