# Construct large sparse matrix by blocks

**URL:** <https://discourse.julialang.org/t/construct-large-sparse-matrix-by-blocks/10034>\
**Category:** Performance\
**Created:** [March 28, 2018, 5:14pm UTC](https://discourse.julialang.org/t/construct-large-sparse-matrix-by-blocks/10034 "2018-03-28T17:14:04Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![WenlongGong](https://avatars.discourse-cdn.com/v4/letter/w/3d9bf3/32.png) [@WenlongGong](https://discourse.julialang.org/u/WenlongGong)\
**Post date:** [March 28, 2018, 5:14pm UTC](https://discourse.julialang.org/t/construct-large-sparse-matrix-by-blocks/10034/1 "2018-03-28T17:14:04Z")

</div>

I’m looking for a function to construct a sparse matrix based on several blocks of smaller sparse matrices.  
An simple example:  
`A11=A12=A21=A22=sprandn(4,2,0.6)`  
The final sparse matrix A should be a combination of these 4 blocks like:  
A11 A12  
A21 A22  
`blockdiag()` doesn’t help directly here since it only returns block diagonal matrix. And the matrices I worked with are pretty large. So I do care about the performance of such operation.

---

<div class="post-metadata">

**Author:** ![fredrikekre](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/fredrikekre/32/1688_2.png) [@fredrikekre](https://discourse.julialang.org/u/fredrikekre)\
**Post date:** [March 28, 2018, 5:30pm UTC](https://discourse.julialang.org/t/construct-large-sparse-matrix-by-blocks/10034/2 "2018-03-28T17:30:25Z")

</div>

Is normal concatenation not good/fast enough?

```julia
julia> A11 = A12 = A21 = A22 = sprand(4, 4, 0.6);

julia> A = [A11 A12;
            A21 A22];

```

---

<div class="post-metadata">

**Author:** ![WenlongGong](https://avatars.discourse-cdn.com/v4/letter/w/3d9bf3/32.png) [@WenlongGong](https://discourse.julialang.org/u/WenlongGong)\
**Post date:** [March 28, 2018, 7:50pm UTC](https://discourse.julialang.org/t/construct-large-sparse-matrix-by-blocks/10034/3 "2018-03-28T19:50:10Z")

</div>

That’s what I’m looking for! Thank you!!

---

<div class="post-metadata">

**Author:** ![tk3369](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tk3369/32/2824_2.png) [@tk3369](https://discourse.julialang.org/u/tk3369)\
**Post date:** [March 28, 2018, 8:53pm UTC](https://discourse.julialang.org/t/construct-large-sparse-matrix-by-blocks/10034/4 "2018-03-28T20:53:45Z")

</div>

What do I do when the number of blocks are dynamic?

---

<div class="post-metadata">

**Author:** ![rdeits](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rdeits/32/286_2.png) [@rdeits](https://discourse.julialang.org/u/rdeits)\
**Post date:** [March 28, 2018, 8:59pm UTC](https://discourse.julialang.org/t/construct-large-sparse-matrix-by-blocks/10034/5 "2018-03-28T20:59:53Z")

</div>

`[]` is just helpful syntax for the functions `vcat`, `hcat`, and `hvcat`, so you can just call those yourself:

```julia
julia> blocks = [eye(2) for _ in 1:6]

julia> hcat(blocks...)
2×12 Array{Float64,2}:
 1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0
 0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0

julia> vcat(blocks...)
12×2 Array{Float64,2}:
 1.0 0.0
 0.0 1.0
 1.0 0.0
 0.0 1.0
 1.0 0.0
 0.0 1.0
 1.0 0.0
 0.0 1.0
 1.0 0.0
 0.0 1.0
 1.0 0.0
 0.0 1.0

julia> hvcat((3, 3), blocks...)
4×6 Array{Float64,2}:
 1.0 0.0 1.0 0.0 1.0 0.0
 0.0 1.0 0.0 1.0 0.0 1.0
 1.0 0.0 1.0 0.0 1.0 0.0
 0.0 1.0 0.0 1.0 0.0 1.0

julia> hvcat((2, 2, 2), blocks...)
6×4 Array{Float64,2}:
 1.0 0.0 1.0 0.0
 0.0 1.0 0.0 1.0
 1.0 0.0 1.0 0.0
 0.0 1.0 0.0 1.0
 1.0 0.0 1.0 0.0
 0.0 1.0 0.0 1.0

```
