# Evaluate function combining Float & Vector

**URL:** <https://discourse.julialang.org/t/evaluate-function-combining-float-vector/66044>\
**Category:** General Usage\
**Created:** [August 8, 2021, 9:32pm UTC](https://discourse.julialang.org/t/evaluate-function-combining-float-vector/66044 "2021-08-08T21:32:03Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![Albert\_Zevelev](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/albert_zevelev/32/11844_2.png) [@Albert\_Zevelev](https://discourse.julialang.org/u/Albert_Zevelev)\
**Post date:** [August 8, 2021, 9:32pm UTC](https://discourse.julialang.org/t/evaluate-function-combining-float-vector/66044/1 "2021-08-08T21:32:03Z")

</div>

Suppose I have a function of 3 variables:  
`f(x,y,z)= x + y + z`  
Suppose I have:

- a variable `s=1.4`, which is a `Float64`
- a vector `a=[4.2;5.0]` which is a `2-element Vector{Float64}`.

How can I evaluate the function `f` at the arguments  
`x=s`  
`y,z=a`  
`f(s,a)` doesn’t seem to work  
Nor does `f(s,Tuple(a))`

---

<div class="post-metadata">

**Author:** ![pdeffebach](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/pdeffebach/32/10320_2.png) [@pdeffebach](https://discourse.julialang.org/u/pdeffebach)\
**Post date:** [August 8, 2021, 9:37pm UTC](https://discourse.julialang.org/t/evaluate-function-combining-float-vector/66044/2 "2021-08-08T21:37:43Z")

</div>

Assuming `f(s, a, a)` doesn’t work?

Maybe an `ntuple` with splatting?

```julia
julia> a = [1, 2];

julia> (ntuple(t -> a, 2)...,)
([1, 2], [1, 2])

```

---

<div class="post-metadata">

**Author:** ![jzr](https://avatars.discourse-cdn.com/v4/letter/j/eb9ed0/32.png) [@jzr](https://discourse.julialang.org/u/jzr)\
**Post date:** [August 8, 2021, 9:46pm UTC](https://discourse.julialang.org/t/evaluate-function-combining-float-vector/66044/3 "2021-08-08T21:46:10Z")

</div>

`f(s, a...)`

---

<div class="post-metadata">

**Author:** ![lmiq](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/lmiq/32/18314_2.png) [@lmiq](https://discourse.julialang.org/u/lmiq)\
**Post date:** [August 8, 2021, 9:57pm UTC](https://discourse.julialang.org/t/evaluate-function-combining-float-vector/66044/4 "2021-08-08T21:57:13Z")

</div>

If this is performance critical I would suggest

```julia
f(s,ntuple(i->a[i],2)...)

```

Such that the length of the tuple and splatting is known at compile time. AFAIK spatting general vectors sometimes allocate something (at least I remember discussions here with this kind of issues)

Or define `f(x,v::AbstractVector) = f(x,v[1],v[2])`

---

<div class="post-metadata">

**Author:** ![Albert\_Zevelev](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/albert_zevelev/32/11844_2.png) [@Albert\_Zevelev](https://discourse.julialang.org/u/Albert_Zevelev)\
**Post date:** [August 8, 2021, 10:10pm UTC](https://discourse.julialang.org/t/evaluate-function-combining-float-vector/66044/5 "2021-08-08T22:10:17Z")

</div>

thanks!  
right now it’s not performance critical & sometimes `a` is a 2 element vector, sometimes it’s 5-elements etc…  
But this will be very useful for me elsewhere & other users who come to this page w/ the same issue.

Does anyone have advice on a better way to name this issue? @mbauman

---

<div class="post-metadata">

**Author:** ![jzr](https://avatars.discourse-cdn.com/v4/letter/j/eb9ed0/32.png) [@jzr](https://discourse.julialang.org/u/jzr)\
**Post date:** [August 8, 2021, 10:20pm UTC](https://discourse.julialang.org/t/evaluate-function-combining-float-vector/66044/6 "2021-08-08T22:20:05Z")

</div>

Expand array into function arguments

---

<div class="post-metadata">

**Author:** ![lmiq](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/lmiq/32/18314_2.png) [@lmiq](https://discourse.julialang.org/u/lmiq)\
**Post date:** [August 8, 2021, 10:22pm UTC](https://discourse.julialang.org/t/evaluate-function-combining-float-vector/66044/7 "2021-08-08T22:22:02Z")

</div>

If the vectors are always small and you can use SVectors, you can define:

```julia
f(s,v::SVector{N}) where N = f(s,ntuple(i->v[i],N)...)

```

---

<div class="post-metadata">

**Author:** ![Albert\_Zevelev](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/albert_zevelev/32/11844_2.png) [@Albert\_Zevelev](https://discourse.julialang.org/u/Albert_Zevelev)\
**Post date:** [August 8, 2021, 10:44pm UTC](https://discourse.julialang.org/t/evaluate-function-combining-float-vector/66044/8 "2021-08-08T22:44:35Z")

</div>

OK, it turns out not to be so simple bc I in my case I need broadcasting & `s` is a 10-by-1 vector, `a` is a 10-by-1 vector consisting of 2-element subvectors…  
It works if I do a comprehension though…

---

<div class="post-metadata">

**Author:** ![lmiq](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/lmiq/32/18314_2.png) [@lmiq](https://discourse.julialang.org/u/lmiq)\
**Post date:** [August 8, 2021, 11:08pm UTC](https://discourse.julialang.org/t/evaluate-function-combining-float-vector/66044/9 "2021-08-08T23:08:52Z")

</div>

I couldn’t resist testing:

```julia
julia> using StaticArrays

julia> f(x,y,z) = @. x = x + y + z
f (generic function with 2 methods)

julia> g(s,x::SVector{N}) where N = f(s,ntuple(i->x[i],N)...)
g (generic function with 2 methods)

julia> x = SVector{2,Vector{Float64}}(rand(3),rand(3));

julia> s = rand(3);

julia> @btime g($s,$x)
  9.037 ns (0 allocations: 0 bytes)
3-element Vector{Float64}:
 3.861199086034205e6
 1.0012982079149153e7
 9.331970140004177e6

```
