Bazman
Bazman

Reputation: 2150

How to find if a matrix is Singular in Matlab

I use the function below to generate the betas for a given set of guess lambdas from my optimiser.

When running I often get the following warning message:

Warning: Matrix is singular to working precision. In NSS_betas at 9 In DElambda at 19 In Individual_Lambdas at 36

I'd like to be able to exclude any betas that form a singular matrix form the solution set, however I don't know how to test for it?

I've been trying to use rcond() but I don't know where to make the cut off between singular and non singular?

Surely if Matlab is generating the warning message it already knows if the matrix is singular or not so if I could just find where that variable was stored I could use that?

function betas=NSS_betas(lambda,data)

mats=data.mats2'; 
lambda=lambda;
yM=data.y2';
nObs=size(yM,1);
G= [ones(nObs,1) (1-exp(-mats./lambda(1)))./(mats./lambda(1)) ((1-exp(-mats./lambda(1)))./(mats./lambda(1))-exp(-mats./lambda(1))) ((1-exp(-mats./lambda(2)))./(mats./lambda(2))-exp(-mats./lambda(2)))];

betas=G\yM;
r=rcond(G);

end

Thanks for the advice:

I tested all three examples below after setting the lambda values to be equal so guiving a singular matrix

 if (~isinf(G))
  r=rank(G);
  r2=rcond(G);
  r3=min(svd(G)); 
 end

r=3, r2 =2.602085213965190e-16; r3= 1.075949299504113e-15;

So in this test rank() and rcond () worked assuming I take the benchmark values as given below.

However what happens when I have two values that are close but not exactly equal?

How can I decide what is too close?

Upvotes: 15

Views: 13541

Answers (5)

Giorgos Altanis
Giorgos Altanis

Reputation: 2760

There are special tools designed for this problem, appropriately called "rank revealing matrix factorizations". To my best (albeit a little old) knowledge, a good enough way to decide whether a n x n matrix A is nonsingular is to go with

det(A) <> 0 <=> rank(A) = n

and use a rank-revealing QR factorization of A:

AP = QR

where Q is orthogonal, P is a permutation matrix and R is an upper triangular matrix with the property that the magnitude of the diagonal elements is decreased along the diagonal.

Upvotes: 1

Andrey Rubshtein
Andrey Rubshtein

Reputation: 20915

Condition number (Maximal singular value/Minimal singular value) is another good method:

  cond(A)

It uses svd. It should be as close to 1 as possible. Very large values mean that the matrix is almost singular. Inf means that it is precisely singular.

Note that almost all of the methods mentioned in other answers use somehow svd :

Upvotes: 3

dinkelk
dinkelk

Reputation: 2786

rcond is the right way to go here. If it nears the machine precision of zero, your matrix is singular. I usually go with:

if( rcond(A) < 1e-12 )
    % This matrix doesn't look good
end

You can experiment with a value that suites your needs, but taking the inverse of a matrix that is even close to singular with MATLAB can produce garbage results.

Upvotes: 14

bla
bla

Reputation: 26069

you can also check this by:

min(svd(A))>eps

and verifying that the smallest singular value is larger than eps, or any other numerical tolerance that is relevant to your needs. (the code will return 1 or 0)

Here's more info about it...

Upvotes: 3

mathematician1975
mathematician1975

Reputation: 21351

You could compare the result of rank(G) with the number of columns of G. If the rank is less than the column dimension, you will have a singular matrix.

Upvotes: 11

Related Questions