# Right multiplication of Diagonal matrix

**URL:** <https://discourse.julialang.org/t/right-multiplication-of-diagonal-matrix/12590>\
**Category:** Numerics\
**Created:** [July 23, 2018, 3:11am UTC](https://discourse.julialang.org/t/right-multiplication-of-diagonal-matrix/12590 "2018-07-23T03:11:39Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![pochoi](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/pochoi/32/3742_2.png) [@pochoi](https://discourse.julialang.org/u/pochoi)\
**Post date:** [July 23, 2018, 3:11am UTC](https://discourse.julialang.org/t/right-multiplication-of-diagonal-matrix/12590/1 "2018-07-23T03:11:39Z")

</div>

In Julia 0.7

```julia
using SparseArrays
n = 1000
@time Diagonal(1:n) * sparse(1:n, n:-1:1, 1:n)
@time sparse(1:n, n:-1:1, 1:n) * Diagonal(1:n)
  0.002262 seconds (42 allocations: 110.125 KiB)
  0.893608 seconds (39 allocations: 80.578 KiB)

```

Right multiplication is much slower than left multiplication. The reason is, in `stdlib/LinearAlgebra/src/diagonal.jl`, we have

```julia
mul!(out::AbstractMatrix, A::Diagonal, in::AbstractMatrix) = out .= A.diag .* in

```

but we have no `mul!(out::AbstractMatrix, in::AbstractMatrix, A::Diagonal)`. Therefore, the right multiplication actually uses the more general method `mul!(C::AbstractMatrix, A::AbstractVecOrMat, B::AbstractVecOrMat)` in `stdlib/LinearAlgebra/src/matmul.jl`, which is not optimized for Diagonal matrix multiplication.

On the other hand, we do have optimized code for right multiplication method `rmul!(A::AbstractMatrix, D::Diagonal)` in `stdlib/LinearAlgebra/src/diagonal.jl`

```julia
using SparseArrays

n = 1000
@time rmul!(sparse(1:n, n:-1:1, 1:n), Diagonal(1:n));
@time sparse(1:n, n:-1:1, 1:n) * Diagonal(1:n);

  0.000061 seconds (39 allocations: 120.109 KiB)
  0.908803 seconds (39 allocations: 80.578 KiB)

```

My questions:  
Should we reuse `rmul!` and `lmul!` for `mul!`?  
Should we also have `mul!(out::AbstractMatrix, in::AbstractMatrix, A::Diagonal)`?

---

<div class="post-metadata">

**Author:** ![Pbellive](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/pbellive/32/3604_2.png) [@Pbellive](https://discourse.julialang.org/u/Pbellive)\
**Post date:** [August 28, 2018, 7:25pm UTC](https://discourse.julialang.org/t/right-multiplication-of-diagonal-matrix/12590/2 "2018-08-28T19:25:25Z")

</div>

Hi @pochoi. I’ve just been looking into performance of multiplication by diagonal matrices and came across your post. I’ve done some benchmarking and posted an issue in the main Julia repo. I include the link here for reference

[https://github.com/JuliaLang/julia/issues/28934](https://github.com/JuliaLang/julia/issues/28934)

---

<div class="post-metadata">

**Author:** ![pochoi](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/pochoi/32/3742_2.png) [@pochoi](https://discourse.julialang.org/u/pochoi)\
**Post date:** [August 29, 2018, 2:28am UTC](https://discourse.julialang.org/t/right-multiplication-of-diagonal-matrix/12590/3 "2018-08-29T02:28:56Z")

</div>

It looks great! There is a lot of room for improvement on sparse matrix operations in Julia!
