I would recommend using svd (unless you are really sure that your matrix is not poorly prepared). Then, based on the special meanings, you make decisions about further actions. This may sound like a bust, but in the long run it will pay off.
Now, if your matrix A is actually invertible, then pseudo inverse of A same as inv(A) , however, if you are close to “singularity”, you can easily make the appropriate decision about how to actually make pseudo inverse . Naturally, these decisions will depend on your application.
A simple example is added :
> A= randn(3, 2); A= [AA(:, 1)+ A(:, 2)] A = -1.520342 -0.239380 -1.759722 0.022604 0.381374 0.403978 0.852420 1.521925 2.374346 > inv(A) warning: inverse: matrix singular to machine precision, rcond = 0 ans = Inf Inf Inf Inf Inf Inf Inf Inf Inf > [U, S, V]= svd(A) U = -0.59828 -0.79038 0.13178 0.13271 -0.25993 -0.95646 0.79022 -0.55474 0.26040 S = Diagonal Matrix 3.6555e+000 0 0 0 1.0452e+000 0 0 0 1.4645e-016 V = 0.433921 0.691650 0.577350 0.382026 -0.721611 0.577350 0.815947 -0.029962 -0.577350 > s= diag(S); k= sum(s> 1e-9) % simple thresholding based decision k = 2 > Ainv= (U(:, 1: k)* diag(1./ s(1: k))* V(:, 1: k)')' Ainv = -0.594055 -0.156258 -0.273302 0.483170 0.193333 0.465592 -0.110885 0.037074 0.192290 > A* Ainv ans = 0.982633 0.126045 -0.034317 0.126045 0.085177 0.249068 -0.034317 0.249068 0.932189 > A* pinv(A) ans = 0.982633 0.126045 -0.034317 0.126045 0.085177 0.249068 -0.034317 0.249068 0.932189
eat
source share