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

tqu*_*ton 5 iteration variables wolfram-mathematica

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

Do["f" <> ToString[i] = i*2, {i, 1, 20}]
Run Code Online (Sandbox Code Playgroud)

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

我的错误:

Set :: write:f <> 1中的标记StringJoin受保护。>>

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

Mr.*_*ard 5

要实现这一点,您需要"f" <> ToString[i]Set( =) 看到它之前评估表达式,或者您尝试使用 head 分配给对象StringJoin,正如错误消息试图告诉您的那样。此外,您不能对字符串进行赋值,因此您需要使用 (surprise) 将其转换为 Symbol Symbol。一种方法是使用Evaluate

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

{f1, f2, f17}
Run Code Online (Sandbox Code Playgroud)

{2, 4, 34}

然而,这对于Mathematica 来说通常不是一个好的行动方案。例如,如果这些符号中的任何一个已经存在并且具有分配的值,则操作将失败。一个可以解决这个问题有更多的精力为答案,看到不加评估了如何块符号?(或更具体地说,在我的回答中)但同样,这通常不是一个好的行动方案。

正常的方法是使用索引对象,如 PrinceBilliard 所示。

请参阅此问题、其答案以及其下方评论中链接的四个相关问题,以了解有关此主题的更多信息。