The question addressed here (from OR Stack Exchange) is how to find all left inverses of a matrix. The question specifies dimensions around 200 x 10, which is what we will use. Before proceeding, we note that for an \(m\times n\) matrix \(A\) with \(m \ge n\) to have a left inverse \(B,\) \(A\) must have full column rank. If it does not, a nonzero vector \(x\) exists for which \(Ax = \mathbf{0},\) in which case \(B(Ax) = \mathbf{0} = (BA)x = Ix,\) a contradiction.
For the computations, we will use the pracma
package.
library(pracma)
The first step is to create a sample matrix \(A\).
set.seed(71522) # for reproducibility
rows <- 200
cols <- 10
A <- matrix(rnorm(rows * cols), nrow = rows)
To get one left inverse, we use the pracma
method
pinv
. This computes the Moore-Penrose
pseudoinverse of the original matrix.
B <- pinv(A)
We can verify the result by computing \(B \cdot A\) (and rounding away decimal dust).
round(B %*% A, digits = 5)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 1 0 0 0 0 0 0 0 0 0
[2,] 0 1 0 0 0 0 0 0 0 0
[3,] 0 0 1 0 0 0 0 0 0 0
[4,] 0 0 0 1 0 0 0 0 0 0
[5,] 0 0 0 0 1 0 0 0 0 0
[6,] 0 0 0 0 0 1 0 0 0 0
[7,] 0 0 0 0 0 0 1 0 0 0
[8,] 0 0 0 0 0 0 0 1 0 0
[9,] 0 0 0 0 0 0 0 0 1 0
[10,] 0 0 0 0 0 0 0 0 0 1
For any other left inverse \(C\), we
have \((C - B) \cdot A =I - I =
\mathbf{0}\), so \(C = B + M\)
where \(M\) is a matrix whose rows
belong to the left null space of \(A.\)
We can use the pracma
method nullspace
to get
a basis for the left null space. To do so, we transpose \(A\) and then transpose the basis.
N <- A |> t() |> pracma::nullspace() |> t()
dim(N)
[1] 190 200
The null space of \(A\) has dimension 190. Adding to \(B\) any 10 x 200 matrix whose rows are linear combinations of the rows of \(N\) forms another left inverse. We demonstrate this with a random combination.
C <- matrix(rnorm(cols * nrow(N)), nrow = cols) %*% N + B
round(C %*% A, digits = 5)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 1 0 0 0 0 0 0 0 0 0
[2,] 0 1 0 0 0 0 0 0 0 0
[3,] 0 0 1 0 0 0 0 0 0 0
[4,] 0 0 0 1 0 0 0 0 0 0
[5,] 0 0 0 0 1 0 0 0 0 0
[6,] 0 0 0 0 0 1 0 0 0 0
[7,] 0 0 0 0 0 0 1 0 0 0
[8,] 0 0 0 0 0 0 0 1 0 0
[9,] 0 0 0 0 0 0 0 0 1 0
[10,] 0 0 0 0 0 0 0 0 0 1