# Array Flattening arrays of matrices given by rules

Fix an $n$ and an $m$ positive integers.I have some set of four $n\times n$ matrices $A$,$B$,$Y$,$Z$ (where $Z$ is the zero matrix). I'd like to input the $nm\times nm$ matrix of block matrices given by

ArrayFlatten [{{A,B,Z,...,Z},{Y,A,B,Z,...,Z}{Z,Y,A,B,Z...},...,{Z,...,Z,Y,A}}]


I have tried to do this using SparseArray using something like

SparseArray[{
{i_, i_} -> A,
{i_, j_} /; i - j == 1 -> B,
{i_, j_} /; j - i == 1 -> Y,
{i_, j_} /; Abs[i - j] > 1 -> Z
}, {m, m}]


SparseArray does not seem to play nice with matrix inputs, and I do not think it is the right tool. I am told that things are not lists. What is an easy way to build block matrices out of rules (as Sparse Array does for matrices of numbers).

n=2;

A = ConstantArray[1, {n, n}];
B = ConstantArray[2, {n, n}];
Y = ConstantArray[3, {n, n}];
Z = ConstantArray[0, {n, n}];

ClearAll[a, b, y, z]

m = 10;

mat=Normal@SparseArray[{{i_,i_}->a,{i_,j_}/;i-j==1->b,{i_,j_}/;j-i 1->y,{i_,j_}/;Abs[i-j]>1->z},{m,m}]

ArrayFlatten[mat /. {a -> A, b -> B, y -> Y, z -> Z}]

• So the only thing different here is that you defined $A,B,Y,Z$ after defining the matrix and the use of Normal(is that necessary?)? I am not in a position to check that this works yet, but could you explain why it does? – PVAL Feb 9 '16 at 6:39
• @PVAL I have edited my code. – Alexey Golyshev Feb 9 '16 at 6:46
• This certainly works. I am not sure why my original method doesn't. Thanks very much anyway. – PVAL Feb 9 '16 at 23:49
• @PVAL SparseArray cannot insert matrices as elements. Lower case $a, b, y, z$ are only placeholders for $A, B, Y, Z$ and inside ArrayFlatten I replace them by rules. – Alexey Golyshev Feb 10 '16 at 3:33