在循环中创建变量名
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
.
那样进行转换
我的目标是在循环中创建很多函数 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
.