# Inverse of a large sparse Hermitian block matrix

I am looking for a method (if it exists) for the inverse of a large sparse Hermitian block matrix. The off diagonal sparse matrices, named δ are 4x4, and they have only one non null element on the diagonal part. The matrices M are Hermitian and also 4x4. I need a way to perform the inverse of M3 or the determinant. I am interested in a generalization of this structure for a matrix of higher rank with the same "telescopic" structure. Here is the code

dimension        = 4;
mat              = ( {{m, a, b, b},{Conjugate[a], m, b, b},{Conjugate[b], Conjugate[b], m, a},{Conjugate[b], Conjugate[b], Conjugate[a], m}});
Subscript[O, 4]  = ( {{0, 0, 0, 0},{0, 0, 0, 0},{0, 0, 0, 0},{0, 0, 0, 0}} );
Subscript[δ, 1]  = ( {{I ρ, 0, 0, 0},{0, 0, 0, 0},{0, 0, 0, 0},{0, 0, 0, 0}} );
Subscript[δ, 2]  = ( {{0, 0, 0, 0},{0, I ρ, 0, 0},{0, 0, 0, 0},{0, 0, 0, 0}} );
Subscript[δ, 3]  = ( {{0, 0, 0, 0},{0, 0, 0, 0},{0, 0, I ρ, 0},{0, 0, 0, 0}} );
Subscript[δ, 4]  = ( {{0, 0, 0, 0},{0, 0, 0, 0},{0, 0, 0, 0},{0, 0, 0, I ρ}} );
Subscript[δ, 22] = ArrayFlatten[( {{Subscript[O, 4], Subscript[δ, 2]}, {Subscript[δ, 2], Subscript[O, 4]}})];
Subscript[δ, 33] = ArrayFlatten[( {
{Subscript[O, 4], Subscript[O, 4], Subscript[O, 4], Subscript[δ, 3]},
{Subscript[O, 4], Subscript[O, 4], Subscript[δ, 3], Subscript[O, 4]},
{Subscript[O, 4], Subscript[δ, 3], Subscript[O, 4], Subscript[O, 4]},
{Subscript[δ, 3], Subscript[O, 4], Subscript[O, 4], Subscript[O, 4]}
} )];
Subscript[δ, 44] = ArrayFlatten[( {
{Subscript[O, 4], Subscript[O, 4], Subscript[O, 4], Subscript[O, 4], Subscript[O, 4], Subscript[O, 4], Subscript[O, 4], Subscript[δ, 4]},
{Subscript[O, 4], Subscript[O, 4], Subscript[O, 4], Subscript[O, 4], Subscript[O, 4], Subscript[O, 4], Subscript[δ, 4], Subscript[O, 4]},
{Subscript[O, 4], Subscript[O, 4], Subscript[O, 4], Subscript[O, 4], Subscript[O, 4], Subscript[δ, 4], Subscript[O, 4], Subscript[O, 4]},
{Subscript[O, 4], Subscript[O, 4], Subscript[O, 4], Subscript[O, 4], Subscript[δ, 4], Subscript[O, 4], Subscript[O, 4], Subscript[O, 4]},
{Subscript[O, 4], Subscript[O, 4], Subscript[O, 4], Subscript[δ, 4], Subscript[O, 4], Subscript[O, 4], Subscript[O, 4], Subscript[O, 4]},
{Subscript[O, 4], Subscript[O, 4], Subscript[δ, 4], Subscript[O, 4], Subscript[O, 4], Subscript[O, 4], Subscript[O, 4], Subscript[O, 4]},
{Subscript[O, 4], Subscript[δ, 4], Subscript[O, 4], Subscript[O, 4], Subscript[O, 4], Subscript[O, 4], Subscript[O, 4], Subscript[O, 4]},
{Subscript[δ, 4], Subscript[O, 4], Subscript[O, 4], Subscript[O, 4], Subscript[O, 4], Subscript[O, 4], Subscript[O, 4], Subscript[O, 4]}
} )];

OutM[M_, δ_] := ArrayFlatten[{{M, δ},{-δ, M}}];
M1 = OutM[mat, Subscript[δ, 1]];
M2 = FullSimplify[OutM[M1, Subscript[δ, 22]]];
M3 = FullSimplify[OutM[M2, Subscript[δ, 33]]];
M4 = FullSimplify[OutM[M3, Subscript[δ, 44]]];


And I need the inverse of M4. The structure is telescopic in some sense.

-
Even better, could you provide code to construct it so we don't have to re-write it? – acl May 28 '12 at 11:11
You are aware that inverting a large, sparse matrix invariably results in a large, dense matrix, right? Or do you have any guarantee that the inverse has a known/predictable sparsity pattern? – J. M. May 28 '12 at 11:20
If the matrix isn't too big, what exactly is the problem with using Inverse[]/Det[] directly? – J. M. May 28 '12 at 12:12
I think there's an error in your definition of OutM. A bracket and a comma are missing. I presume it should be OutM[M_, \[Delta]_] := ArrayFlatten[( {{M, \[Delta]},{-\[Delta], M}} )]; – Sjoerd C. de Vries May 28 '12 at 13:34
Here's a related question. The approach to block-inversion discussed in Daniel Lichtblau's answer should work here. – Eli Lansey May 29 '12 at 21:36