Positive Semi-definite Matrix Problem
65 views (last 30 days)
Suppose I have a large M by N dense matrix C, which is not full rank, when I do the calculation A=C'*C, matrix A should be a positive semi-definite matrix, but when I check the eigenvalues of matrix A, lots of them are negative values and very close to 0 (which should be exactly equal to zero due to rank).
I think this may due to numerical issue, is there any other way I could make matrix A positive semi-definite?
I tried to do this: [V,D]=eig(A); A=V*abs(D)*V'
it didn't work
Richard Brown on 7 Aug 2013
You're just going to have to live with it. Your matrix is PSD to double precision. If you look at the magnitude of the "zero" eigenvalues, they're probably all around 1e-14 or 1e-15. If your code relies on them being positive, you should amend this to test for eigenvalues near zero that may be negative.
Adam Wyatt on 31 Mar 2015
FYI: C' is conjugate transpose - you should use C.' if you don't want the complex conjugate.
If it is indeed due to a numerical issue, then you can look at using an SVD, which can be useful for eliminating the near-singular values. Numerical Recipes has a good description of how one might achieve what you want: http://apps.nrbook.com/c/index.html - chapter 2.6
Using the SVD, you may be able to approximate your matrix by zeroing those vectors with near singular values. You might think approximating your matrix is bad, but do bear in mind that all numerics are approximations and linear algebra with large matrices can easily rack up quite large truncation errors!
Alternatively switch to arbitrary precision arithmetic. Matlab (via symbolic math toolbox), Maple and Mathematica all support this. However, speed will significantly decrease!!