我想在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,其答案以及其下面的注释中链接的四个相关问题。