cMi*_*nor 3 wolfram-mathematica max
我a,b,c
在while循环之前定义了三个变量,然后计算一个新的var d
.
我想摆脱三个变量中的最大值a,b,c
,然后用d
值替换它; 所以我可以保留原始变量中的最小值.
a = 1;
b = 2;
c = 10;
While[ condition,
compute d using values of a b and c
d = 4;
a = 1;
b = 2;
c = 4; (*c = d *)
]
Run Code Online (Sandbox Code Playgroud)
要做到这一点,我想要获得三个变量的最大值,然后更新它依赖于最大的价值..
a = 1;
b = 2;
c = 10;
d = 4;
temp = Max[a, b];
maxim = Max[c, temp];
a = a; (*did not change*)
b = b; (*did not change*)
c = d = 4 (*changed!!*)
Run Code Online (Sandbox Code Playgroud)
所以在那之后会发生一个新的迭代并更新三个变量......
如果您可以接受列表(数组)中的值而不是单个名为Symbols的值,并且如果您的意思是"最接近"而不是最大,那么您可以执行以下操作:
vars = {1, 10, 0};
vars = ReplacePart[vars, Position[vars, Nearest[vars, 5][[1]]] -> 5];
vars
Run Code Online (Sandbox Code Playgroud)
(* Out= {5, 10, 0} *)
这也假设值是唯一的,或者您想要替换所有匹配的值(例如,如果1
此示例中的列表中有多个值).
如果你总是想要取代最大的价值,那么你可以Max[vars]
而不是Nearest
.
根据更新的问题描述,我建议:
vars = {1, 10, 0};
d = 5;
vars = With[{m = Max[vars]}, If[d < m, vars /. m -> d, vars]]
Run Code Online (Sandbox Code Playgroud)
如果您希望自动执行此操作,您可以使用:
SetAttributes[repmax, HoldFirst]
repmax[s_Symbol, n_?NumericQ] := If[n < #, s = s /. # -> n]& @ Max@s
Run Code Online (Sandbox Code Playgroud)
现在:
vals = {1, 10, 0};
repmax[vals, 5];
vals
Run Code Online (Sandbox Code Playgroud)
{1, 5, 0}
vals = {1, 10, 0};
repmax[vals, 12];
vals
Run Code Online (Sandbox Code Playgroud)
{1, 10, 0}
另一种选择如下:
Clear@updateList
SetAttributes[updateList, HoldFirst]
updateList[list_, value_] :=
Module[{listMax = Max@list},
list = (list /. listMax -> value);]
Run Code Online (Sandbox Code Playgroud)
现在,如果我按照您的情况定义变量并使用该函数:
a = 1; b = 10; c = 0;
updateList[{a,b,c},5];
{a,b,c}
Out[1]= {1, 5, 0}
Run Code Online (Sandbox Code Playgroud)
您可以看到b
最大的变量已被新值替换.