Por partes.
Cuando se declara un array se puede indicar el valor inicial de sus elementos mediante una lista de valores, estos se colocan entre llaves y separados por comas. Entre el nombre del array y la lista se debe colocar un '=' que en este caso es un separador (no confundir con el operador '=' usado en expresiones). Por ejemplo:
int numero[] = {1, 2, 3};
En este caso es el compilador quien calcula el numero de elementos del array en base al numero de valores en la lista (obvio, son tres).
Si se indica el numero de elementos y esto no coincide con el numero de valores en la lista:
int numero[5] = {1, 2, 3};
Hay dos escenarios: si el numero de valores es menor los elementos restantes (numero[3] y numero[4] en este caso) toman el valor 0 (o 0.0 o NULL, dependiendo del tipo). En otras palabras la ultima declaración es equivalente a:
int numero[5] = {1, 2, 3, 0, 0};
Si el numero de valores es mayor entonces se genera "comportamiento no definido" (es un error).
----
Si se trata de un array donde sus elementos son a su vez arrays aplica lo mismo: se indica el valor de cada elemento mediante una lista donde cada uno es una lista.
En tu caso:
int matriz[2][3] = {
{1, 2, 3}, /* <== Valores de matriz[0] */
{4, 5} /* <== Valores de matriz[1] */
};
El array "matriz" consiste a su vez de dos arrays (matriz[0] y matriz[1]) cada uno de tres elementos de tipo int. El primero tiene sus tres elementos inicializados, el segundo todos menos uno (ese toma el valor cero).
Un saludo