2017-08-14 1 views
2

Je comprends Julia peut appliquer l'argument élément par élément à une fonction par f. (X) dans v0.6Comment appliquer un argument à Array {Function, 1} par élément intelligemment dans Julia?

x = [1, 2, 3] 
f = x->3x 
@assert f.(x) = [3, 6, 9] 

Nous pouvons maintenant définir f comme tableau {Fonction, 1}.

f1(x) = 3x 
f2(x) = 4x 
f = [f1, f2] 
x = 2 
@assert isa(f, Array{Function,1}) == true 
# f.(x) is unavailable 

Je veux appliquer des arguments à la fonction élément par élément comme syntaxe ci-dessus, ne pas utiliser map, [_f(x) for _f in f]

Quelqu'un peut-il être au courant de ce problème?

Répondre

8

Vous pouvez diffuser l'opérateur de tuyau (|>), par ex.

x .|> f 
+1

excellent. Ce code est très concis. – Hiroaki

+0

Oui, c'est une belle illustration de l'élégance du code Julia. –

2

Vous devez prendre soin de définir x et f, dans certains cas vous échouerez. Votre premier x appliqué sur votre dernier f échouera.

julia> 5 .|> [x->2x, x->7x] 
2-element Array{Int64,1}: 
10 
35 

julia> [2, 5] .|> [x->2x, x->7x] 
2-element Array{Int64,1}: 
    4 
35 

julia> [2 5] .|> [x->2x, x->7x] 
2-element Array{Int64,2}: 
    4 10 
14 35 

julia> [2 5] .|> [x->2x x->7x] 
1×2 Array{Int64,2}: 
4 35 

julia> [2, 5] .|> [x->2x x->7x] 
2×2 Array{Int64,2}: 
4 14 
10 35 

julia> [2 3 5] .|> [x->2x x->7x] 
ERROR: DimensionMismatch("arrays could not be broadcast to a common") 

julia> [2, 3, 5] .|> [x->2x, x->7x] 
ERROR: DimensionMismatch("arrays could not be broadcast to a common") 

julia> x = [1, 2, 3]; f = [x->2x, x->3x]; x .|> f 
ERROR: DimensionMismatch("arrays could not be broadcast to a common") 
+0

Avez-vous confondu le deuxième exemple de la dernière? '' 'taille ([2, 3, 5]) = (3, 1) taille ([x-> 2x x-> 7x]) = (1, 2) ' '' La taille de la retourner Array est (3, 2). Cela peut fonctionner correctement. – Hiroaki

+0

J'ai revérifié la diffusion, énormément. – Hiroaki

+0

Oui, c'est génial maintenant. – Hiroaki

0

Voici une autre possibilité:

((f, x)->f(x)).([f1, f2], x)