# Tullio for general dimensional tensors

**URL:** <https://discourse.julialang.org/t/tullio-for-general-dimensional-tensors/104787>\
**Category:** General Usage\
**Tags:** tullio\
**Created:** [October 10, 2023, 6:38am UTC](https://discourse.julialang.org/t/tullio-for-general-dimensional-tensors/104787 "2023-10-10T06:38:32Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![J.J.sakurai](https://avatars.discourse-cdn.com/v4/letter/j/cc9497/32.png) [@J.J.sakurai](https://discourse.julialang.org/u/J.J.sakurai)\
**Post date:** [October 10, 2023, 6:38am UTC](https://discourse.julialang.org/t/tullio-for-general-dimensional-tensors/104787/1 "2023-10-10T06:38:32Z")

</div>

Tullio.jl seems to be super faster. But how can I write tullio code for general dimensional tensors.  
For example, an outer product of vectors, do we need such a branch as follow? Is there any way to write the following code for a general `d` ?

```julia
using Tullio

function get_outer_product(v)
       d = length(v)
       if d == 2
           v1 = v[1]
           v2 = v[2]
           @tullio R[i,j] := v1[i] * v2[j]
       elseif d == 3
           v1 = v[1]
           v2 = v[2]
           v3 = v[3]
           @tullio R[i,j,k] := v1[i] * v2[j] * v3[k]
       elseif d == 4
           v1 = v[1]
           v2 = v[2]
           v3 = v[3]
           v4 = v[4]
           @tullio R[i,j,k,l] := v1[i] * v2[j] * v3[k] * v4[l]
       end
       return R
end

v = [rand(4), rand(3), rand(5)]
R = get_outer_product(v) # 4×3×5 tensor

```

---

<div class="post-metadata">

**Author:** ![abraemer](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/abraemer/32/51403_2.png) [@abraemer](https://discourse.julialang.org/u/abraemer)\
**Post date:** [October 10, 2023, 7:20am UTC](https://discourse.julialang.org/t/tullio-for-general-dimensional-tensors/104787/2 "2023-10-10T07:20:33Z")

</div>

For this specific instance I would use multiple dispatch like so:

```julia
using Tullio

function get_outer_product(v1, v2)
       @tullio R[i,j] := v1[i] * v2[j]
end

function get_outer_product(v1, v2, v3)
       @tullio R[i,j,k] := v1[i] * v2[j] * v3[k]
end

function get_outer_product(v1, v2, v3, v4)
       @tullio R[i,j,k,l] := v1[i] * v2[j] * v3[k] * v4[l]
end

v = [rand(4), rand(3), rand(5)]
R = get_outer_product(v...) # 4×3×5 tensor

```

Todo this generically for any number of vectors you probably need some generated function magic…

---

<div class="post-metadata">

**Author:** ![J.J.sakurai](https://avatars.discourse-cdn.com/v4/letter/j/cc9497/32.png) [@J.J.sakurai](https://discourse.julialang.org/u/J.J.sakurai)\
**Post date:** [October 10, 2023, 7:27am UTC](https://discourse.julialang.org/t/tullio-for-general-dimensional-tensors/104787/3 "2023-10-10T07:27:03Z")

</div>

Yeah. I am looking for the generated function magic…
