# Vector BroadcastingΒΆ

Julia has very nice and performant functions for broadcasting: `broadcast`

and `broadcast!`

, which however does not work with functors. For customized computation, you have to pass in function argument, which would lead to severe performance degradation. *NumericExtensions.jl* provides `vbroadcast`

and `vbroadcast!`

to address this issue.

**Synopsis**

```
vbroadcast(f, x, y, dim) # apply a vector y to vectors of x along a specific dimension
vbroadcast!(f, dst, x, y, dim) # write results to dst
vbroadcast1!(f, x, y) # update x with the results
```

Here, `f`

is a binary functor, and `x`

and `y`

are arrays such that `length(y) == size(x, dim)`

.

**Examples**

```
vbroadcast(f, x, y, 1) # r[:,i] = f(x[:,i], y) for each i
vbroadcast(f, x, y, 2) # r[i,:] = f(x[i,:], y) for each i
vbroadcast(f, x, y, 3) # r[i,j,:] = f(x[i,j,:], y) for each i, j
vbroadcast1!(Add(), x, y, 1) # x[:,i] += y[:,i] for each i
vbroadcast1!(Mul(), x, y, 2) # x[i,:] .*= y[i,:] for each i
```

**Difference from** `broadcast`

Unlike `broadcast`

, you have to specify the vector dimension for `vbroadcast`

. The benefit is two-fold: (1) the overhead of figuring out broadcasting shape information is elimintated; (2) the shape of `y`

can be flexible.

```
x = rand(5, 6)
y = rand(6)
vbroadcast(Add(), x, y, 2) # this adds y to each row of x
broadcast(+, x, reshape(y, 1, 6)) # with broadcast, you have to first reshape y into a row
```