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.

Is normal concatenation not good/fast enough?

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

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

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

`[ ]`

is just helpful syntax for the functions `vcat`

, `hcat`

, and `hvcat`

, so you can just call those yourself:

```
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
```

3 Likes