2011-04-21 5 views
8

Comment procéder pour appliquer chaque élément d'une liste à chaque argument d'une fonction? Un peu comme Map, sauf avec un nombre variable d'arguments.Appliquer la liste aux arguments dans Mathematica

Ainsi, par exemple, si j'ai une fonction action[x1_,x2_,x3_]:=..., et j'ai une liste {1,2,3}, comment pourrais-je créer une fonction pour appeler action avec action[1,2,3]?

Je voudrais que cette fonction soit capable de me gérer le changement action-action[x1_,x2], et toute autre chose, aussi, la liste étant maintenant {1,2}, et d'appeler l'action maintenant avec action[1,2].

Répondre

10

Basé sur "Type de carte similaire, sauf avec un nombre variable d'arguments." Je pense que vous cherchez peut-être Apply au niveau 1. Cela se fait avec:

Apply[function, array, {1}] 

ou le raccourci:

function @@@ array 

Voici ce qu'il fait:

array = {{1, 2, 3}, {a, b, c}, {Pi, Sin, Tan}}; 

action @@@ array 
{action[1, 2, 3], action[a, b, c], action[Pi, Sin, Tan]}

La terminologie que j'ai utilisée ci-dessus pourrait être trompeuse, et limite la puissance de Apply. L'expression à laquelle vous appliquez action n'a pas besoin d'être un tableau rectangulaire. Il n'a même pas besoin d'être un List: {...} ou ses éléments sont des listes. Voici un exemple intégrant ces possibilités:

args = {1, 2} | f[a, b, c] | {Pi}; 

action @@@ args 
action[1, 2] | action[a, b, c] | action[Pi]
  • args est pas un List mais un ensemble de Alternatives
  • le nombre d'arguments passés à action varie
  • l'un des éléments de args a la tête f

Observons que:

  • action remplace la tête de chaque élément de args, quelle qu'elle soit.
  • La tête de args est conservée dans la sortie, dans ce cas Alternatives (forme courte: a | b | c)
+0

Quelle est la différence entre votre solution et celle de Sasha? Je veux dire, je vois '@@@' dans le vôtre et seulement '@@' dans le sien. Comment peuvent-ils tous les deux être pareils? –

+0

@ d'o-o'b ils ne sont pas les mêmes, mais ils sont pour la même fonction: 'Apply'.'f @@ {1,2,3}' donne 'f [1,2,3]' en remplaçant 'List' par' f' au "niveau 0" (le plus haut niveau de '{1,2,3 } '). En revanche, 'f @@@ {1}, {2}, {3}}' donne {f [1], f [2], f [3]}, en remplaçant 'List' par' f' pour chaque _element_ de la liste, ou "Niveau 1". Cela peut également être fait pour les niveaux plus profonds d'une expression en utilisant 'Apply [f, expression, levelspec]' mais il n'y a pas de raccourci (comme '@@' ou '@@@') pour cela. Voir l'aide sur 'Level' pour plus de détails sur levelspec. –

+0

@Wizard: merci! –

8
Apply[action, {1,2,3}] 

Ceci peut également être entré comme action @@ {1,2,3}.

-2

Pourquoi ne pas simplement d'utiliser l'action [lst_ LISTQ?]?

+0

Est-ce la question à laquelle vous vouliez répondre? –

Questions connexes