# How do you concatenate matrices? And how do you make block matrices?

This is pretty trivial to do in Matlab, but I have not seen a function for it in Mathematica. Here is how you can do it with Join and Transpose. Is there an easier way to do it than this?

(*Concatenate Matrix Right*)
A1 = Table[Subscript[a1, i, j], {i, n}, {j, n}];
A2 = Table[Subscript[a2, i, j], {i, n}, {j, m}];
Transpose[Join[Transpose[A1], Transpose[A2]]] // MatrixForm

(*Concatenate  Matrix Below*)
A1 = Table[Subscript[a1, i, j], {i, n}, {j, n}];
A2 = Table[Subscript[a2, i, j], {i, m}, {j, n}];
Join[A1, A2] // MatrixForm

(*2X2 Block Matrix*)
A11 = Table[Subscript[a11, i, j], {i, n}, {j, n}];
A12 = Table[Subscript[a12, i, j], {i, n}, {j, m}];
A21 = Table[Subscript[a21, i, j], {i, m}, {j, n}];
A22 = Table[Subscript[a22, i, j], {i, m}, {j, m}];
Transpose[
Join[Transpose[Join[A11, A21]],Transpose[Join[A12, A22]]]] // MatrixForm


Sample output for n=3 and m=2:

• Check out Join[mat1,mat2,2] for catting on the right. And ArrayFlatten might handle more complicated cases. Nov 1, 2015 at 17:44
• That was exactly what I was looking for! Nov 1, 2015 at 18:17
• This is a related discussion Partitioned matrix operations. (And it is not something that can be done trivially in Matlab.) Nov 2, 2015 at 1:12
• Do you see those manually drawn lines in the matrixes in the question above? I made the MatrixFormDivided resource function so that you don't have to manually draw them. Mar 14, 2023 at 17:39

As Daniel Lichtblau suggested in the comment, ArrayFlatten is the way.

• ArrayFlatten[{{A1, A2}}] // MatrixForm gives your Out[198]
• ArrayFlatten[{{A1}, {A2}}] // MatrixForm gives your Out[201]
• ArrayFlatten[{{A11, A12}, {A21, A22}}] // MatrixForm gives your Out[206]

From the application tab on Join:

• It often pays to read the docs. ;) Nov 1, 2015 at 20:22

Just for fun, the more complex construction of block matrices may also be accomplished using SparseArray:

SparseArray[{
Band[{1, 1}] -> A11, Band[{1, 4}] -> A12,
Band[{4, 1}] -> A21, Band[{4, 4}] -> A22},
{5, 5}
] // MatrixForm