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

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)

所以在那之后会发生一个新的迭代并更新三个变量......

Mr.*_*ard 6

如果您可以接受列表(数组)中的值而不是单个名为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}


abc*_*bcd 6

另一种选择如下:

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最大的变量已被新值替换.

  • 在Leonid看到它之前删除你的评论.他会告诉大家! - > (2认同)