在循环中创建变量名

Create variable names in loop

我的目标是在循环中创建很多函数 f_i。这些函数取决于参数 a[[i]],可以从数组 A = {a1, a2, ...} 中获取。为了消除interator的影响i,导致所有函数都相同的情况,我希望每次迭代都创建变量名。

示例:假设我有数组W = {1,2,3, ..., 100},我应该创建变量w1 = 1, w2 = 2, ..., w100 = 100。我试图在 for 循环的帮助下做到这一点:

loc[expr1_, expr2_] := 
  ToExpression[StringJoin[ToString[expr1], ToString[expr2]]];
For[i = 1, i <= 100, i++, 
{
loc[w, i] = W[[i]];
}]

当我需要查看wk包含哪个值变量时,则wk未定义。但是 loc[w, k] = k 是已知的。 如何定义变量 wi?或者还有另一种在循环中创建函数的方法吗? 提前致谢

您使用的方式 {} 让我相信您之前有使用其他编程语言的经验。

Mathematica 是一种非常不同的语言,您所了解和期望的某些内容可能是错误的。 Mathematica 仅使用 {} 表示这是一个元素列表。它不用于对代码块进行分组。 ; 更常用于对代码块进行分组。

接下来,试试

W={1,2,3};
For[i=i,i<=3,i++,
   ToExpression["w"<>ToString[i]<>"="<>ToString[i]]
];
w2

然后看到 returns

2

我知道接受过其他编程语言培训的人强烈希望使用 For 来完成任务。对于 Mathematica 中的大多数目的,还有其他方法可以做到这一点。

举一个简单的例子

W={1,2,3};
Map[ToExpression["z"<>ToString[#]<>"="<>ToString[#]]&,W];
z2

returns

2

我使用 z 而不是 w 的地方只是为了确定它没有向我显示 w2

的先前缓存值

你甚至可以做

W={1,2,3};
loc[n_,v_]:=ToExpression[ToString[n]<>ToString[v]<>"="<>ToString[v]];
Map[loc[a,#]&,W];
a3

哪个returns

3

通常,您会为此使用索引变量。例如,

ClearAll[x, xs]
n = 4
xs = Array[Indexed[x, #] &, 4]

使用随机数据的示例:

RandomSeed[314]
mA = RandomInteger[{0, 99}, {n, n}]
vb = RandomInteger[{0, 99}, n]
Solve[mA.xs == vb, xs]

这只是为了说明;对于示例问题,通常会使用 LinearSolve。例如,MapThread[Rule, {xs, LinearSolve[mA, vb]}].

使用函数变量会更简单,例如w[1],但是这里有一个方法来定义w1

注意 Clear 可以使用符号的字符串版本清除赋值。

W = {1, 2, 7, 9};
Clear @@ Map["w" <> ToString[#] &, W]
Map[(Evaluate[Symbol["w" <> ToString[#]]] = #) &, W];
w9

9

Symbol /@ Map["w" <> ToString[#] &, W]

{1, 2, 7, 9}

或者,使用函数变量 。 . .

Map[(w[#] = #) &, W]

{1, 2, 7, 9}

w[9]

9

此外,使用 OP 的结构

Clear[loc]
Clear[w]
Clear @@ Map["w" <> ToString[#] &, W]

W = {1, 2, 3, 4};

loc[expr1_, expr2_] := StringJoin[ToString[expr1], ToString[expr2]]

For[i = 1, i <= 4, i++, Evaluate[Symbol[loc[w, i]]] = W[[i]]]

Symbol /@ Map["w" <> ToString[#] &, W]

{1, 2, 3, 4}

注意 Evaluate[Symbol[loc[w, i]]] = W[[i]]] 的优点是,如果 W[[i]] 处的数据是字符串,则不会像使用 ToExpression.

那样进行转换