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. – Daniel Lichtblau Nov 1 '15 at 17:44
• That was exactly what I was looking for! – luke wendt Nov 1 '15 at 18:17
• This is a related discussion Partitioned matrix operations. (And it is not something that can be done trivially in Matlab.) – Anton Antonov Nov 2 '15 at 1:12

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

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

From the application tab on Join: 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 