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

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

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

我的错误:



任何帮助将是巨大的。谢谢!

最佳答案

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

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

{f1, f2, f17}



但是,对于Mathematica,这通常不是一个好的方法。例如,如果这些符号中的任何一个已经存在并已分配了值,则该操作将失败。如对How to Block Symbols without evaluating them?(或更具体而言,在my answer here中)的回答所示,您可以付出更多的努力来解决此问题,但通常,这并不是一个好的方法。

正常的方法是使用PrinceBilliard显示的indexed objects

有关此主题的更多信息,请参见this question,其答案以及其下面的注释中链接的四个相关问题。

10-08 05:24
查看更多