我想在 Mathematica 中创建多个具有迭代名称的变量,如下所示:
Do["f" <> ToString[i] = i*2, {i, 1, 20}]
我得到 f1=2, f2=4, f3=6, ... 等等。
我的错误:
Set::write: f<>1 中的标记 StringJoin 受保护。>>
任何帮助都会很棒。谢谢!
我想在 Mathematica 中创建多个具有迭代名称的变量,如下所示:
Do["f" <> ToString[i] = i*2, {i, 1, 20}]
我得到 f1=2, f2=4, f3=6, ... 等等。
我的错误:
Set::write: f<>1 中的标记 StringJoin 受保护。>>
任何帮助都会很棒。谢谢!
要实现这一点,您需要在( ) 看到它"f" <> ToString[i]
之前评估表达式,或者您尝试使用 head 分配给一个对象,就像错误消息试图告诉您的那样。此外,您不能对字符串进行赋值,因此您需要使用 (surprise) 将其转换为符号。一种方法是使用:Set
=
StringJoin
Symbol
Evaluate
Do[Evaluate[Symbol["f" <> ToString[i]]] = i*2, {i, 1, 20}]
{f1, f2, f17}
{2, 4, 34}
然而,这通常不是使用Mathematica的好方法。例如,如果这些符号中的任何一个已经存在并且分配了值,则操作将失败。正如如何在不评估符号的情况下阻止符号的答案中所见,人们可以通过更多的努力来解决这个问题?(或更具体地说,在我的回答中)但同样,这通常不是一个好的行动方案。
正常的方法是使用PrinceBilliard 显示的索引对象。
请参阅此问题、其答案以及下方评论中链接的四个相关问题,以了解有关此主题的更多信息。
Do[f[i] = i^2, {i,1,20}]
迭代变量名称的工作方式类似于 f[i]。您还可以声明迭代的函数名称,例如f[2][x_] := ...