根据Mathematica中的第四个更新3个变量的方法

时间:2011-10-26 04:49:37

标签: wolfram-mathematica max

我在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!!*)

之后会发生新的迭代并更新三个变量......

3 个答案:

答案 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}