2011-10-26 10 views
3

whileループの前にa,b,cという3つの変数を定義してから、新しい変数dを計算します。Mathematicaの4番目の変数に応じて3つの変数を更新する方法

私は3つのヴァースa,b,cの中で最大の値を取り除き、dの値に置き換えたいと思っています。だから私は元のvars threの最小値を保つことができます。

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 *) 


] 

ので、私は3 VARSの最大を取得すると思うし、その後ウィッヒだから後に新しいiteraionが発生し、更新することを最大の価値..

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

を持っているdepenedingそれを更新して実行します3つのヴァース...

+0

したがって、数値の3つの変数のリストがあり、リスト内の最大のメンバーを新しい値に置き換えたいとしますか? – Simon

+0

はい、絶対に正しいです – cMinor

+0

あなたの変数は個々の名前付きシンボル( 'a'、' b'、 'c')であるか、' {1,5、0} 'のようなリスト個々の要素は 'Part'でアクセスできます)? –

答えて

6

別のオプションは次のとおりです。

[email protected] 
SetAttributes[updateList, HoldFirst]  
updateList[list_, value_] := 
    Module[{listMax = [email protected]}, 
     list = (list /. listMax -> value);] 

私はあなたの場合のように変数を定義し、使用している場合機能:

a = 1; b = 10; c = 0; 
updateList[{a,b,c},5]; 
{a,b,c} 

Out[1]= {1, 5, 0} 

最大であった変数bが新しい値で置き換えられていることがわかります。

+0

+1 ;クリーンなコード。 –

+0

@ Mr.Wizardあなたが正しいです、私は 'ReleaseHold'は必要ありません。 'HoldFirst'は' updateList'の属性であり、 'list'の最初のインスタンスで使われます。 2番目と3番目の 'list'はそれぞれ' ReplaceAll'と 'Max'の引数なので、その属性は保持されません。 – abcd

+2

Leonidが見る前にあなたのコメントを削除してください。彼は誰にでも言います! : - > –

6

個々の名前付きシンボルではなくリスト(配列)の値を受け入れることができ、最大値ではなく、最も近い値を意味する場合は、

vars = {1, 10, 0}; 

vars = ReplacePart[vars, Position[vars, Nearest[vars, 5][[1]]] -> 5]; 

vars 
(* Out= {5, 10, 0} *)

これも値は、あなたが(この例では、リストに複数の1がある場合など)に一致するすべての値を置き換えたいまたは一意であることを前提としています。

いつも最大の値を置き換えるものがあればNearestではなくMax[vars]になります。更新され、問題の説明に照らして


、私が提案している:あなたがこれを自動化したい場合

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]& @ [email protected] 

vals = {1, 10, 0}; 
repmax[vals, 5]; 

vals 
{1, 5, 0}
vals = {1, 10, 0}; 
repmax[vals, 12]; 

vals 
{1, 10, 0}
+0

ちょうど~90から10k! :) – abcd

+0

投票のための@yoda票:D –

+0

+10〜9999。私は10Kまであなたをプッシュする名誉を残す.... –

3

これはおそらく、この問題に取り掛かるための最良の方法ではありません、

a = 1; b = 10; c = 0; 
Position[#, [email protected]#] &@{a, b, c} 
{a, b, c} = ReplacePart[{a, b, c}, % -> 5] 

あなたがリストabc = {1, 10, 0}ようにあなたの元の値を定義してから最大の要素を交換したほうが良いと思いますリストの私が気付いたように、ウィザード氏は彼の答えでちょうどやりました。

あなたはまた、

SetAttributes[ReplaceMax, HoldFirst] 
ReplaceMax[list : {__Symbol}, val_] := Module[{pos}, 
    pos = [email protected][#, [email protected][#, N[#] \[Element] Reals &]]&@list; 
    Do[Evaluate[(HoldPattern /@ [email protected])[[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} 
+0

+1あなたはあなたのためにすべての後に正しい理解を持っていたので –

関連する問題