Su $X$ es cuadrado y tiene la pseudo-inversa. O en este caso a la izquierda inversa. Bien para una matriz cuadrada este es justo el inverso. Así que voy a responder a la pregunta de cómo obtener la pseudo-inversa de una sub-parte de las columnas de una matriz cuadrada dada la inversa de esa matriz.
Datos:
$$\pmatrix{A & B} = X$$
$$X^{-1} = \pmatrix{C \\ D}$$
de modo que $X^{-1}X = I$ da
$$CA = I$$
a la izquierda de la inversa de la $A$ columna de la matriz.
Dado un general (izquierda) inverso, para ser la pseudo-inversa, es necesario que el $C^\top$ tiene el mismo tamaño de columna como $A$ (ver mi página de perfil para un enlace donde muestro esto acerca de la pseudo-inversa). Esto no es cierto en general, por lo que utilizar las otras filas de la matriz inversa ( $D$ $DA = \mathbf{0}$ ) para hacer que suceda. Si $C^\top$ compartido el mismo espacio como $A$, debido a $D$ es el espacio complementario a $A$ entonces tendríamos $C^\top D = \mathbf{0}$. Por tanto, el problema de encontrar la pseudo-inversa de a $A$ $X^{-1}$ es equivalente a orthogonalizing las filas de $C$ contra las filas de $D$.
Me disculpo si mi descripción no es perfectamente comprensible, por tanto, permítanme tratar algunos precisa de código. Mi código hábito es python, vamos a la matriz $X$ x ser una lista de listas, y x_i la inversa. La función dot() es la más obvia (producto escalar):
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
Esto resultará en la pseudo-inversa en la primera $n$ filas de la (ahora modificado) inversa. Esto es menos de cálculo que la búsqueda de la pseudo-inversa a partir de cero.