2011-03-03 75 views
4

如何將值傳遞給具有多個變量的給定表達式?這些變量的值放置在需要傳入表達式的列表中。將列表中存儲的參數傳遞給表達式

+3

@ user642327請允許我歡迎你們來的StackOverflow,並提醒三件事,我們通常在這裏做的:1)當你得到幫助,儘量給它太**回答問題**你專業2)的面積['閱讀常見問題解答](http://tinyurl.com/2vycnvr)3)當您看到好的問答時,請將它們投票['使用灰色三角形](http://i.imgur.com/kygEP.png)「該系統的可信度基於用戶通過分享知識獲得的聲譽。另外請記住接受更好地解決您的問題的答案,如果有的話,['通過按複選標記](http://i.imgur.com/uqJeW.png) – 2011-03-03 04:05:20

回答

3

例如,對於兩個元件

f[l_List]:=l[[1]]^2+l[[2]]^2 

爲任何數量的元件

g[l_List] := l.l 

h[l_List]:= Norm[l]^2 

因此的:

Print[{f[{a, b}], g[{a, b}], h[{a, b}]}] 

{a^2 + b^2, a^2 + b^2, Abs[a]^2 + Abs[b]^2} 

兩個,只是爲了好玩:

i[l_List] := [email protected][j^2, {j, l}] 

j[l_List] := SquaredEuclideanDistance[l, ConstantArray[0, Length[l]] 

編輯

關於你的定義

f[{__}] = a^2 + b^2; 

它有幾個問題:

1)你要定義一個常量,因爲a,b不是參數。
2)您正在使用Set定義一個函數,而不是SetDelayed,因此評估立即完成。剛剛嘗試例如

s[l_List] = Total[l] 

與正確的方式:

s[l_List] := Total[l] 

使用之前將其保持不計算。

3)您使用的圖案沒有名稱{__},因此您不能在表達式的右側使用它。正確的做法可能是:

f[{a_,b_}]:= a^2+b^2; 
4

一對夫婦的其他方式...

  1. 使用規則置換

    f /. Thread[{a,b} -> l]

    (其中Thread[{a,b} -> l]將評估爲{a->1, b->2}

  2. 使用純函數

    Function[{a,b}, Evaluate[f]] @@ l

    (其中@@是一種形式的應用[]和Evaluate[f]用於將功能成Function[{a,b}, a^2+b^2]

+0

是的。我們可以寫一個博客:1001種方法來獲得'SquaredEuclideanDistance []'而不提及它。 :D – 2011-03-03 04:03:47

+0

我避免提及Dot [l,l] b/c我認爲它有點太過於關注問題的細節... – 2011-03-03 04:18:28

+0

...直到現在,就是這樣。 :-) – 2011-03-03 04:18:54

12

你的修訂的問題是簡單的,只需

f @@ {a,b,c,...} == f[a,b,c,...] 

其中@@是簡寫Apply 。在內部,{a,b,c}List[a,b,c](您可以在任何表達式上使用FullForm查看),而Apply只是用Head,List,用新的Head,f更改函數。的Apply操作並不侷限於名單,一般

f @@ g[a,b] == f[a,b] 

而且,看Sequence這確實

f[Sequence[a,b]] == f[a,b] 

所以,我們能做到這一點,而不是

f[ Sequence @@ {a,b}] == f[a,b] 

其中而迂腐看起來可能非常有用。

編輯Apply有一個可選的2 第二參數,指定一個水平,即

Apply[f, {{a,b},{c,d}}, {1}] == {f[a,b], f[c,d]} 

注:Apply[fcn, expr,{1}]速記是@@@,如所討論的here,但以指定任何其他級描述你需要使用全功能表格。

相關問題