我在while循环之前定义了三个变量a,b,c
,然后计算一个新的变量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 *)
]
这样做我想要获得三个变量的最大值,然后根据最大的价值更新它。
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!!*)
之后会发生新的迭代并更新三个变量......
答案 0 :(得分:6)
如果您可以接受列表(数组)中的值而不是单个名为Symbols的值,并且如果您的意思是“最接近”而不是最大,那么您可以执行以下操作:
vars = {1, 10, 0};
vars = ReplacePart[vars, Position[vars, Nearest[vars, 5][[1]]] -> 5];
vars
(* 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]]
如果您希望自动执行此操作,可以使用:
SetAttributes[repmax, HoldFirst]
repmax[s_Symbol, n_?NumericQ] := If[n < #, s = s /. # -> n]& @ Max@s
现在:
vals = {1, 10, 0};
repmax[vals, 5];
vals
{1, 5, 0}
vals = {1, 10, 0};
repmax[vals, 12];
vals
{1, 10, 0}
答案 1 :(得分:6)
另一种选择如下:
Clear@updateList
SetAttributes[updateList, HoldFirst]
updateList[list_, value_] :=
Module[{listMax = Max@list},
list = (list /. listMax -> value);]
现在,如果我按照你的情况定义变量并使用函数:
a = 1; b = 10; c = 0;
updateList[{a,b,c},5];
{a,b,c}
Out[1]= {1, 5, 0}
您可以看到最大的变量b
已被新值替换。
答案 2 :(得分:3)
这可能不是解决此问题的最佳方法,
a = 1; b = 10; c = 0;
Position[#, Max@#] &@{a, b, c}
{a, b, c} = ReplacePart[{a, b, c}, % -> 5]
最好在列表abc = {1, 10, 0}
中定义原始值,然后替换列表的max元素。正如我注意到巫师先生刚刚回答的那样。
您也可以执行类似
的操作SetAttributes[ReplaceMax, HoldFirst]
ReplaceMax[list : {__Symbol}, val_] := Module[{pos},
pos = Flatten@Position[#, Max@Select[#, N[#] \[Element] Reals &]]&@list;
Do[Evaluate[(HoldPattern /@ Unevaluated@list)[[p]]] = val,
{p, pos}]]
然后
In[15]:= {a, b, c, d, e} = {1, 15, 6, 17 + I, x};
In[16]:= ReplaceMax[{a, b, c, d, e}, 5]
{a, b, c, d, e}
Out[17]= {1, 5, 6, 17 + I, x}