Given the inverse of a block matrix - Complete problem

431 Views Asked by At

Given $X$ a block matrix

$$\pmatrix{A&B}$$

where $A$ is $m \times n$ and $B$ is $m \times (n−m)$.
I know a priori the value of $X \times (X^{T} \times X)^{-1}$.

Substituting $X$:

$$\pmatrix{A&B} \times \pmatrix{A^{T}A&A^{T}B\\B^{T}A&B^{T}B}^{-1}$$

I want to obtain the value of $A \times (A^{T} \times A)^{-1}$.
I have tried many articles and tools, for instance,

http://en.wikipedia.org/wiki/Block_matrix_pseudoinverse

and the Matrix Inversion Lemma, but I did not managed to find a solution.

Any ideas? Thank you!

1

There are 1 best solutions below

5
On BEST ANSWER

Your $X$ is square and you have the pseudo-inverse for it. Or in this case a left inverse. Well for a square matrix this is just the inverse. So I am going to answer the question of how to obtain the pseudo-inverse of a sub-portion of columns of a square matrix given the inverse for that matrix.

Knowns: $$\pmatrix{A & B} = X$$ $$X^{-1} = \pmatrix{C \\ D}$$ so that $X^{-1}X = I$ gives $$CA = I$$ a left inverse for the $A$ column matrix. Given a general (left) inverse, for it to be the pseudo-inverse, it need be that $C^\top$ has the same column span as $A$ (see my profile page for a link where I show this about the pseudo-inverse). This will not be true in general, so we use the other rows of the inverse ($D$ with $DA = \mathbf{0}$) to make it happen. If $C^\top$ shared the same span as $A$, then because $D$ is the complementary space to $A$ then we would have $C^\top D = \mathbf{0}$. Thus the problem of finding the pseudo-inverse for $A$ given $X^{-1}$ is equivalent to orthogonalizing the rows of $C$ against the rows of $D$.

I apologize if my description is not perfectly understandable, so let me try some precise code. My code habit is python, let the matrix $X$ as x be a list of lists, and x_i the inverse. The function dot() is the obvious one (dot product):

for k in range(m-1, n, -1): # the rows in D, counting down from the last
  z = dot(x_i[k][:], x_i[k][:]) # get the norm squared
  for j in range(k): # orthogonalize the previous rows
    cross = dot(x_i[k][:],x_i[j][:])
    t = cross/z
    for i in range(m): x_i[j][i] -= t*x_i[k][i] # orthogonalize row j with row k

This will result in the pseudo-inverse in the first $n$ rows of the (now altered) inverse. This is less computation that finding the pseudo-inverse from scratch.