# Linear algebra -- block diagonal matrix?

**URL:** <https://discourse.julialang.org/t/linear-algebra-block-diagonal-matrix/89971>\
**Category:** General Usage\
**Created:** [November 9, 2022, 9:07am UTC](https://discourse.julialang.org/t/linear-algebra-block-diagonal-matrix/89971 "2022-11-09T09:07:30Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![BLI](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/bli/32/37206_2.png) [@BLI](https://discourse.julialang.org/u/BLI)\
**Post date:** [November 9, 2022, 9:07am UTC](https://discourse.julialang.org/t/linear-algebra-block-diagonal-matrix/89971/1 "2022-11-09T09:07:30Z")

</div>

In MATLAB, there is a constructor `diagm` for block diagonal matrices.

I seem to recall that this is missing in Julia. If I am wrong, what is the most elegant way to create one?

---

<div class="post-metadata">

**Author:** ![rveltz](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rveltz/32/2707_2.png) [@rveltz](https://discourse.julialang.org/u/rveltz)\
**Post date:** [November 9, 2022, 10:09am UTC](https://discourse.julialang.org/t/linear-algebra-block-diagonal-matrix/89971/2 "2022-11-09T10:09:28Z")

</div>

for sparse matrices, there is `SparseArrays.blockdiag`

---

<div class="post-metadata">

**Author:** ![mdavezac](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mdavezac/32/1472_2.png) [@mdavezac](https://discourse.julialang.org/u/mdavezac)\
**Post date:** [November 9, 2022, 10:10am UTC](https://discourse.julialang.org/t/linear-algebra-block-diagonal-matrix/89971/3 "2022-11-09T10:10:33Z")

</div>

There’s also [BlockBandedMatrices · Julia Packages](https://www.juliapackages.com/p/blockbandedmatrices)

---

<div class="post-metadata">

**Author:** ![Per](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/per/32/10387_2.png) [@Per](https://discourse.julialang.org/u/Per)\
**Post date:** [November 9, 2022, 10:28am UTC](https://discourse.julialang.org/t/linear-algebra-block-diagonal-matrix/89971/4 "2022-11-09T10:28:10Z")

</div>

There’s also [BlockDiagonals.jl](https://github.com/invenia/BlockDiagonals.jl) I have not used that package myself, but it looks useful.

However, packages like BlockBandedMatrices and BlockDiagonals do not create Matlab-style matrices, but instead define new types to hold diagonal matrices. That can make some operations (such as matrix-matrix or matrix-vector multiplication) run faster, but also means that some things that are possible in Matlab (such as adding entries outside of the blocks) won’t work.

`SparseArrays.blockdiag(...)` gives basically the same thing as `sparse(blkdiag(..))` would give in Matlab.

For a plain-vanilla Julia matrix, just use any of the above, and then pass the result to the `Matrix` constructor. This is the most Matlab-like option, but therefore it will also be as slow and as memory-consuming as Matlab.
