# Differentiable vectorized piecewise function in Julia?

**URL:** https://discourse.julialang.org/t/differentiable-vectorized-piecewise-function-in-julia/73766
**Category:** General Usage
**Created:** [December 29, 2021, 5:00pm UTC](https://discourse.julialang.org/t/differentiable-vectorized-piecewise-function-in-julia/73766 "2021-12-29T17:00:38Z")
**Posts on this page:** 7
**Page:** 1

<div class="post-metadata">

### Author: ![DeepQ](https://avatars.discourse-cdn.com/v4/letter/d/2bfe46/32.png) [@DeepQ](https://discourse.julialang.org/u/DeepQ)
#### Post date: [December 29, 2021, 5:00pm UTC](https://discourse.julialang.org/t/differentiable-vectorized-piecewise-function-in-julia/73766/1 "2021-12-29T17:00:38Z")

</div>

How could I define this function in Julia?

f(x) = \begin{cases} x^2 &\text {x \< 2} \\ (x-2)(x-4) &\text {otherwise}\end{cases}

---

<div class="post-metadata">

### Author: ![lrnv](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/lrnv/32/19373_2.png) [@lrnv](https://discourse.julialang.org/u/lrnv)
#### Post date: [December 29, 2021, 5:01pm UTC](https://discourse.julialang.org/t/differentiable-vectorized-piecewise-function-in-julia/73766/2 "2021-12-29T17:01:55Z")

</div>

```julia
function f(x)
    if x < 2
        return x^2
    else
        return (x-2)*(x-4)
    end
end

```

?

---

<div class="post-metadata">

### Author: ![DeepQ](https://avatars.discourse-cdn.com/v4/letter/d/2bfe46/32.png) [@DeepQ](https://discourse.julialang.org/u/DeepQ)
#### Post date: [December 29, 2021, 5:29pm UTC](https://discourse.julialang.org/t/differentiable-vectorized-piecewise-function-in-julia/73766/3 "2021-12-29T17:29:02Z")

</div>

Thank you. But I said vectorized and differentiable. Its input must be a vector or matrix.

---

<div class="post-metadata">

### Author: ![rafael.guerra](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rafael.guerra/32/216610_2.png) [@rafael.guerra](https://discourse.julialang.org/u/rafael.guerra)
#### Post date: [December 29, 2021, 5:37pm UTC](https://discourse.julialang.org/t/differentiable-vectorized-piecewise-function-in-julia/73766/4 "2021-12-29T17:37:06Z")

</div>

Linking [related thread](https://discourse.julialang.org/t/performant-piecewise-function-evaluation/45762/4) that seems to address the differentiable part.

As for the vectorization, `f.(x)` should work above?

---

<div class="post-metadata">

### Author: ![machineko](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/machineko/32/10341_2.png) [@machineko](https://discourse.julialang.org/u/machineko)
#### Post date: [December 29, 2021, 5:43pm UTC](https://discourse.julialang.org/t/differentiable-vectorized-piecewise-function-in-julia/73766/5 "2021-12-29T17:43:14Z")

</div>

just add . to make it working on mult-dim data (or just use f.())

```julia
using Zygote

function f(x)
    if all(x .< 2)
        return x.^2
    else
        return (x.-2).*(x.-4)
    end
end

jacobian(f, [1.0, 2.0, 3.0])

```

---

<div class="post-metadata">

### Author: ![lrnv](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/lrnv/32/19373_2.png) [@lrnv](https://discourse.julialang.org/u/lrnv)
#### Post date: [December 29, 2021, 5:44pm UTC](https://discourse.julialang.org/t/differentiable-vectorized-piecewise-function-in-julia/73766/6 "2021-12-29T17:44:12Z")

</div>

I do not understand what you want. For me this is ok :

```julia
julia> function f(x)
           if x < 2
               return x^2
           else
               return (x-2)*(x-4)
           end
       end
f (generic function with 1 method)

julia> x = [1,2,3]
3-element Vector{Int64}:
 1
 2
 3

julia> f.(x)
3-element Vector{Int64}:
  1
  0
 -1

julia> using ForwardDiff

julia> ForwardDiff.derivative.(f,x)
3-element Vector{Int64}:
  2
 -2
  0

julia> 

```

---

<div class="post-metadata">

### Author: ![lrnv](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/lrnv/32/19373_2.png) [@lrnv](https://discourse.julialang.org/u/lrnv)
#### Post date: [December 29, 2021, 5:47pm UTC](https://discourse.julialang.org/t/differentiable-vectorized-piecewise-function-in-julia/73766/7 "2021-12-29T17:47:57Z")

</div>

> [@DeepQ](#):
>
> Its input must be a vector or matrix.

This is unclear to me, as the condition “x \> 2” is undefined for a vector or matrix.
