如何在Mathematica中使用迭代名称保存多个变量?

时间:2012-08-02 18:40:01

标签: variables wolfram-mathematica iteration

我想在Mathematica中创建具有迭代名称的多个变量,如下所示:

Do["f" <> ToString[i] = i*2, {i, 1, 20}]

我得到f1 = 2,f2 = 4,f3 = 6,......等等。

我的错误:

  

Set :: write:标签在f&lt;&gt; 1中的StringJoin受保护。 &GT;&GT;

任何帮助都会很棒。谢谢!

2 个答案:

答案 0 :(得分:4)

要实现此目的,您需要在"f" <> ToString[i]Set)看到它之前评估=表达式,或者尝试分配头部StringJoin的对象,因为错误消息试图告诉你。此外,您无法对字符串进行赋值,因此需要使用(惊讶)Symbol将其转换为符号。一种方法是使用Evaluate

Do[Evaluate[Symbol["f" <> ToString[i]]] = i*2, {i, 1, 20}]

{f1, f2, f17}
  

{2,4,34}

然而,这通常不是 Mathematica 的良好行动方案。例如,如果这些符号中的任何一个已经存在且分配了值,则操作将失败。一个可以通过更多的努力来解决这个问题,如How to Block Symbols without evaluating them?的答案(或更具体地在my answer here中所见),但同样,它通常不是一个好的行动方案。

普通方法是使用indexed objects,如PrinceBilliard所示。

请参阅this question,其答案以及下面评论中链接的四个相关问题,以获取有关此主题的更多信息。

答案 1 :(得分:2)

Do[f[i] = i^2, {i,1,20}]

迭代变量名称的作用类似于f [i]。您还可以声明迭代的函数名称,例如f[2][x_] := ...