# How to generate an array by broadcasting an existing function?(any dim)

**URL:** <https://discourse.julialang.org/t/how-to-generate-an-array-by-broadcasting-an-existing-function-any-dim/82353>\
**Category:** General Usage\
**Tags:** question, array, broadcasting\
**Created:** [June 7, 2022, 1:15am UTC](https://discourse.julialang.org/t/how-to-generate-an-array-by-broadcasting-an-existing-function-any-dim/82353 "2022-06-07T01:15:26Z")\
**Posts on this page:** 10\
**Page:** 1

<div class="post-metadata">

**Author:** ![acsofie](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/acsofie/32/36983_2.png) [@acsofie](https://discourse.julialang.org/u/acsofie)\
**Post date:** [June 7, 2022, 1:15am UTC](https://discourse.julialang.org/t/how-to-generate-an-array-by-broadcasting-an-existing-function-any-dim/82353/1 "2022-06-07T01:15:26Z")

</div>

julia has very useful broadcasting for vector

```julia
julia> f(a,b)=a^2+b-1
f (generic function with 1 method)

julia> f(2,3)
6

julia> f.(1:3,6) # or @. f(1:3,6)
3-element Vector{Int64}:
  6
  9
 14

julia> f.(1:3,6:8)
3-element Vector{Int64}:
  6
 10
 16

julia> A=hcat(f.(1:3,6), f.(1:3,7), f.(1:3,8))
3×3 Matrix{Int64}:
  6 7 8
  9 10 11
 14 15 16

```

Is there any macro or function can do like

```julia
julia> A == @??? f(1:3,6:8)
true

```

**note:** the number of parameters of f is no limit.

---

<div class="post-metadata">

**Author:** ![greg\_plowman](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/greg_plowman/32/8100_2.png) [@greg\_plowman](https://discourse.julialang.org/u/greg_plowman)\
**Post date:** [June 7, 2022, 2:44am UTC](https://discourse.julialang.org/t/how-to-generate-an-array-by-broadcasting-an-existing-function-any-dim/82353/2 "2022-06-07T02:44:10Z")

</div>

You could try:

```julia
map(t -> f(t...), Iterators.product(1:3, 6:8))

```

---

<div class="post-metadata">

**Author:** ![acsofie](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/acsofie/32/36983_2.png) [@acsofie](https://discourse.julialang.org/u/acsofie)\
**Post date:** [June 7, 2022, 3:06am UTC](https://discourse.julialang.org/t/how-to-generate-an-array-by-broadcasting-an-existing-function-any-dim/82353/3 "2022-06-07T03:06:06Z")

</div>

nice answer. thanks.

---

<div class="post-metadata">

**Author:** ![DNF](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dnf/32/10191_2.png) [@DNF](https://discourse.julialang.org/u/DNF)\
**Post date:** [June 7, 2022, 5:04am UTC](https://discourse.julialang.org/t/how-to-generate-an-array-by-broadcasting-an-existing-function-any-dim/82353/4 "2022-06-07T05:04:27Z")

</div>

Aren’t you just looking for

```julia
f.(1:3, (6:8)')

```

?

---

<div class="post-metadata">

**Author:** ![Karthik-d-k](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/karthik-d-k/32/35438_2.png) [@Karthik-d-k](https://discourse.julialang.org/u/Karthik-d-k)\
**Post date:** [June 7, 2022, 5:07am UTC](https://discourse.julialang.org/t/how-to-generate-an-array-by-broadcasting-an-existing-function-any-dim/82353/5 "2022-06-07T05:07:58Z")

</div>

Nice one 😄  
I guess `.` is missing …!!

```julia
f.(1:3, (6:8)')

```

---

<div class="post-metadata">

**Author:** ![DNF](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dnf/32/10191_2.png) [@DNF](https://discourse.julialang.org/u/DNF)\
**Post date:** [June 7, 2022, 5:12am UTC](https://discourse.julialang.org/t/how-to-generate-an-array-by-broadcasting-an-existing-function-any-dim/82353/6 "2022-06-07T05:12:50Z")

</div>

Oops. Thanks, fixed.

---

<div class="post-metadata">

**Author:** ![acsofie](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/acsofie/32/36983_2.png) [@acsofie](https://discourse.julialang.org/u/acsofie)\
**Post date:** [June 7, 2022, 5:45am UTC](https://discourse.julialang.org/t/how-to-generate-an-array-by-broadcasting-an-existing-function-any-dim/82353/7 "2022-06-07T05:45:55Z")

</div>

This is a good answer but seems just satisfy 2-dims array…

---

<div class="post-metadata">

**Author:** ![DNF](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dnf/32/10191_2.png) [@DNF](https://discourse.julialang.org/u/DNF)\
**Post date:** [June 7, 2022, 7:05am UTC](https://discourse.julialang.org/t/how-to-generate-an-array-by-broadcasting-an-existing-function-any-dim/82353/8 "2022-06-07T07:05:40Z")

</div>

Broadcasting (`f.(x, y, z, ...)`) works for any number of dimensions, and will expand into ℝⁿ (or other n-dimensional spaces), but you need to get your inputs in the right shape first. So if you want `z` to lie in the third dimension, you can do

```julia
z = reshape(1:3, 1, 1, :)

```

If you need to do this for arbitrarily high dimensions, it becomes tedious, and @greg_plowman’s solutions is more convenient. If your data is already in the right shape, then it’s better to just use `f.(x, y, z, ...)`.

---

<div class="post-metadata">

**Author:** ![acsofie](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/acsofie/32/36983_2.png) [@acsofie](https://discourse.julialang.org/u/acsofie)\
**Post date:** [June 7, 2022, 7:43am UTC](https://discourse.julialang.org/t/how-to-generate-an-array-by-broadcasting-an-existing-function-any-dim/82353/9 "2022-06-07T07:43:28Z")

</div>

This answer is useful for me. Thanks!

---

<div class="post-metadata">

**Author:** ![rocco\_sprmnt21](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rocco_sprmnt21/32/20127_2.png) [@rocco\_sprmnt21](https://discourse.julialang.org/u/rocco_sprmnt21)\
**Post date:** [July 24, 2022, 3:19pm UTC](https://discourse.julialang.org/t/how-to-generate-an-array-by-broadcasting-an-existing-function-any-dim/82353/11 "2022-07-24T15:19:34Z")

</div>

Obviously, it does not want to be an alternative to the solution with product, but maybe could be useful in other cases to have a generalization (perhaps made better) of this type:

```julia
g(a,b,c)=a^2+b+c-1
r(p,v)=reshape(v, ntuple(e-> e < p ? 1 : length(v), p))

v1=1:4
v2=6:10
v3=2:5

V=[v1,v2,v3]

g.(map(((i,v),)->r(i,v), enumerate(V))...)

```

another way to define the position based reshaping function …

```julia
r(p,v)=eval(Base.Meta.parse("["*join(v,";"^p)*"]"))

```
