Передача параметров из списка в выражение - PullRequest
4 голосов
/ 03 марта 2011

Как я могу передать значения данному выражению с несколькими переменными? Значения этих переменных помещаются в список, который необходимо передать в выражение.

Ответы [ 3 ]

12 голосов
/ 03 марта 2011

Ваш исправленный вопрос прост: просто

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]

, что, хотя педантичный вид может быть очень полезным.

Edit : Apply имеет необязательное значение 2 и аргумент, который задает уровень, то есть

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

Примечание: сокращение для Apply[fcn, expr,{1}] равно @@@, как обсуждено здесь , но для указания любого другого описания уровня вам нужно использоватьполная функциональная форма.

4 голосов
/ 03 марта 2011

Пара других способов ...

  1. Использовать замену правил

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

    (где Thread[{a,b} -> l] будет оцениваться в {a->1, b->2})

  2. Используйте чистую функцию

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

    (где @@ - это форма Apply [], а Evaluate[f] используется для преобразования функции в Function[{a,b}, a^2+b^2])

3 голосов
/ 03 марта 2011

Например, для двух элементов

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] := Total@Table[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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...