# How to use map to multiply two vectors

**URL:** <https://discourse.julialang.org/t/how-to-use-map-to-multiply-two-vectors/95688>\
**Category:** New to Julia\
**Created:** [March 7, 2023, 6:10pm UTC](https://discourse.julialang.org/t/how-to-use-map-to-multiply-two-vectors/95688 "2023-03-07T18:10:28Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![sbacelar](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sbacelar/32/4359_2.png) [@sbacelar](https://discourse.julialang.org/u/sbacelar)\
**Post date:** [March 7, 2023, 6:10pm UTC](https://discourse.julialang.org/t/how-to-use-map-to-multiply-two-vectors/95688/1 "2023-03-07T18:10:28Z")

</div>

Given these two vectors,

`x = [1,2,3]; y=[4,5,6]`

I understand why this is true:

`x * y' == *(x, y')`

But I do not understand why this is true or, better, why `*` does not multiply the two vectors the same way. How can I use `map` to multiply the two vectors?

```julia
C0 = map(*, x, y')

C1 = map((a,b) -> a * b, x, y')

C2 = map((a,b) -> a * b, x, y)

C0 == C1 == C2

```

---

<div class="post-metadata">

**Author:** ![jling](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jling/32/212909_2.png) [@jling](https://discourse.julialang.org/u/jling)\
**Post date:** [March 7, 2023, 6:17pm UTC](https://discourse.julialang.org/t/how-to-use-map-to-multiply-two-vectors/95688/2 "2023-03-07T18:17:52Z")

</div>

`map` is element-wise, `x * y'` is not element-wise, it’s a column vector \* a row vector, so an outer product

---

<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:** [March 7, 2023, 6:48pm UTC](https://discourse.julialang.org/t/how-to-use-map-to-multiply-two-vectors/95688/3 "2023-03-07T18:48:27Z")

</div>

This is where you use broadcasting instead of `map`. It broadcasts across singleton dimensions, and in this particular case, it is trivial to express it as

```julia
x .* y'

```

There’s not all that much point to change from `x * y'` to `x .* y'` in and of itself. But you can fuse it with other operations, or do it in-place, like this

```julia
A .= x .* y'

```

---

<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:** [March 7, 2023, 7:07pm UTC](https://discourse.julialang.org/t/how-to-use-map-to-multiply-two-vectors/95688/5 "2023-03-07T19:07:55Z")

</div>

`x .* y' == map.(*, x, y')`

---

<div class="post-metadata">

**Author:** ![sbacelar](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sbacelar/32/4359_2.png) [@sbacelar](https://discourse.julialang.org/u/sbacelar)\
**Post date:** [March 7, 2023, 7:29pm UTC](https://discourse.julialang.org/t/how-to-use-map-to-multiply-two-vectors/95688/6 "2023-03-07T19:29:40Z")

</div>

> [@rafael.guerra](#):
>
> x \* y’ == map.(\*, x, y’)

This gives an error: `A is not defined`.

---

<div class="post-metadata">

**Author:** ![sbacelar](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sbacelar/32/4359_2.png) [@sbacelar](https://discourse.julialang.org/u/sbacelar)\
**Post date:** [March 7, 2023, 7:31pm UTC](https://discourse.julialang.org/t/how-to-use-map-to-multiply-two-vectors/95688/7 "2023-03-07T19:31:13Z")

</div>

So the answer to my question is:

`map.(*, x, y')`

---

<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:** [March 7, 2023, 7:32pm UTC](https://discourse.julialang.org/t/how-to-use-map-to-multiply-two-vectors/95688/8 "2023-03-07T19:32:40Z")

</div>

It’s for when you have predefined an output array, which I called `A` as an example.

---

<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:** [March 7, 2023, 7:34pm UTC](https://discourse.julialang.org/t/how-to-use-map-to-multiply-two-vectors/95688/9 "2023-03-07T19:34:26Z")

</div>

> [@sbacelar](#):
>
> map.(\*, x, y’)

I think this was probably intended as a joke. Combining `map` and broadcast like that is pointless (but fun).

Just use broadcast.

---

<div class="post-metadata">

**Author:** ![sbacelar](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sbacelar/32/4359_2.png) [@sbacelar](https://discourse.julialang.org/u/sbacelar)\
**Post date:** [March 7, 2023, 7:49pm UTC](https://discourse.julialang.org/t/how-to-use-map-to-multiply-two-vectors/95688/10 "2023-03-07T19:49:16Z")

</div>

OK. Just like this:

```julia
A = zeros(Int, (3, 3))

A .= x .* y'

```

---

<div class="post-metadata">

**Author:** ![jling](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jling/32/212909_2.png) [@jling](https://discourse.julialang.org/u/jling)\
**Post date:** [March 7, 2023, 8:44pm UTC](https://discourse.julialang.org/t/how-to-use-map-to-multiply-two-vectors/95688/11 "2023-03-07T20:44:53Z")

</div>

> [@rafael.guerra](#):
>
> `x * y' == map.(*, x, y')`

that’s not helpful for OP I think.

By definition, `map.()` is doing map for individual element, if you’re writing this you might as well do

```julia
x .* y'

julia> x .* y' == x * y'
true

```

but THIS IS AN COINCIDENCE,

```julia
julia> x' .* y == x' * y
false

```

like, the point shouldn’t be literally use “map” somewhere in the code, the point is `map` is doing element operation and the `*` inside `x * y'` is conceptually not an element-wise operation

---

<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:** [March 8, 2023, 7:01am UTC](https://discourse.julialang.org/t/how-to-use-map-to-multiply-two-vectors/95688/12 "2023-03-08T07:01:36Z")

</div>

`x' * y == mapreduce(*, +, x, y)`

---

<div class="post-metadata">

**Author:** ![jling](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jling/32/212909_2.png) [@jling](https://discourse.julialang.org/u/jling)\
**Post date:** [March 8, 2023, 6:18pm UTC](https://discourse.julialang.org/t/how-to-use-map-to-multiply-two-vectors/95688/13 "2023-03-08T18:18:05Z")

</div>

I still don’t understand why you are insisting on showing simple linear algebra concepts like “dot product” and “outer product” can be expressed using something containing the word “map” – how is this helpful for a beginner like OP?

---

<div class="post-metadata">

**Author:** ![sbacelar](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sbacelar/32/4359_2.png) [@sbacelar](https://discourse.julialang.org/u/sbacelar)\
**Post date:** [March 8, 2023, 7:01pm UTC](https://discourse.julialang.org/t/how-to-use-map-to-multiply-two-vectors/95688/14 "2023-03-08T19:01:05Z")

</div>

I was only trying to find a `Julia` function similar to the `R` `outer` function, where `outer(x, y, FUN = "*") == x %*% t(y)`. `FUN` is a vectorized function like `+` or `+`. That is why I was trying to use `map` in `Julia`.

---

<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:** [March 8, 2023, 7:15pm UTC](https://discourse.julialang.org/t/how-to-use-map-to-multiply-two-vectors/95688/15 "2023-03-08T19:15:47Z")

</div>

And this mapping horror:

```julia
using LinearAlgebra
cross(x,y) == map(.*, circshift(x,2), circshift(y,1)) - map(.*, circshift(x,1), circshift(y,2))

```

---

<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:** [March 8, 2023, 7:23pm UTC](https://discourse.julialang.org/t/how-to-use-map-to-multiply-two-vectors/95688/16 "2023-03-08T19:23:11Z")

</div>

> [@sbacelar](#):
>
> I was only trying to find a `Julia` function similar to the `R` `outer` function

In Julia you don’t use any special function for this, you just broadcast whatever operator you want, like `x .* y'`, `x .+ y'`, `x .< y'`, `x .% y'`, etc etc etc.

---

<div class="post-metadata">

**Author:** ![sbacelar](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sbacelar/32/4359_2.png) [@sbacelar](https://discourse.julialang.org/u/sbacelar)\
**Post date:** [March 8, 2023, 7:29pm UTC](https://discourse.julialang.org/t/how-to-use-map-to-multiply-two-vectors/95688/17 "2023-03-08T19:29:40Z")

</div>

OK. But how could you do in `Julia` something like this in `R`:

`f <- outer(x, y , function(x, y) cos(y) / (1 + x^2))`

---

<div class="post-metadata">

**Author:** ![Oscar\_Smith](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/oscar_smith/32/25343_2.png) [@Oscar\_Smith](https://discourse.julialang.org/u/Oscar_Smith)\
**Post date:** [March 8, 2023, 7:30pm UTC](https://discourse.julialang.org/t/how-to-use-map-to-multiply-two-vectors/95688/18 "2023-03-08T19:30:13Z")

</div>

`cos.(y') ./ (1 .+ x.^2)`, or more simply `@. cos(y') / (1+x^2)`

---

<div class="post-metadata">

**Author:** ![sbacelar](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sbacelar/32/4359_2.png) [@sbacelar](https://discourse.julialang.org/u/sbacelar)\
**Post date:** [March 8, 2023, 7:37pm UTC](https://discourse.julialang.org/t/how-to-use-map-to-multiply-two-vectors/95688/19 "2023-03-08T19:37:57Z")

</div>

> [@Oscar\_Smith](#):
>
> cos.(y’) ./ (1 .+ x.^2)

I got a different result using `R`:

```julia
> f
            [,1] [,2] [,3]
[1,] -0.32682181 0.14183109 0.48008514
[2,] -0.13072872 0.05673244 0.19203406
[3,] -0.06536436 0.02836622 0.09601703

```

and in `Julia`

```julia
julia> @. cos(y') / (1+x^2)
3×1 Matrix{Float64}:
 -0.32682181043180597
  0.05673243709264525
  0.0960170286650366

```

---

<div class="post-metadata">

**Author:** ![Oscar\_Smith](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/oscar_smith/32/25343_2.png) [@Oscar\_Smith](https://discourse.julialang.org/u/Oscar_Smith)\
**Post date:** [March 8, 2023, 7:42pm UTC](https://discourse.julialang.org/t/how-to-use-map-to-multiply-two-vectors/95688/20 "2023-03-08T19:42:22Z")

</div>

Up to rounding error, that’s what I get in Julia also.

---

<div class="post-metadata">

**Author:** ![uniment](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/uniment/32/24532_2.png) [@uniment](https://discourse.julialang.org/u/uniment)\
**Post date:** [March 8, 2023, 7:58pm UTC](https://discourse.julialang.org/t/how-to-use-map-to-multiply-two-vectors/95688/21 "2023-03-08T19:58:40Z")

</div>

```julia
julia> x = [1,2,3]; y=[4,5,6];

julia> @. cos(y') / (1+x^2)
3×3 Matrix{Float64}:
 -0.326822 0.141831 0.480085
 -0.130729 0.0567324 0.192034
 -0.0653644 0.0283662 0.096017

```

[Next page](https://discourse.julialang.org/t/how-to-use-map-to-multiply-two-vectors/95688.md?page=2)
