MATLAB: Does the function chol correctly indicates that a Matrix is positive definite

cholcholesky factorizationeigMATLABpositive definitesingular matrix

According to the MATLAB documentation for the function chol: "[R,p] = chol(A) for positive definite A, produces an upper triangular matrix R from the diagonal and upper triangle of matrix A, satisfying the equation R'*R=A and p is zero. If A is not positive definite, then p is a positive integer and MATLAB® does not generate an error"
I have found an example contradicting the behavior described so I do not understand if I can trust this function or whether there is an error in the documentation.
Let's have the following Matrix.
A =
[[0.957166948 0.421761283 0.655740699 0.655740699];
[0.485375649 0.915735525 0.035711679 0.035711679];
[0.800280469 0.79220733 0.849129306 0.849129306];
[0.141886339 0.959492426 0.933993248 0.933993248]];
Then the Cholesky factorization gives the following result:
[R,p] = chol(A)
R =
0.9783 0.4311 0.6703 0.6703
0 0.8543 -0.2964 -0.2964
0 0 0.5586 0.5586
0 0 0 0.2913
p =
0
So the p = 0 indicates according to the interpretation I have of the documentation that A is positive definite, which also indicates that the matrix A is nonsingular.
However this matrix is clearly singular given that the last two columns are identical. When computing the eigenvalues I get a zero eigenvalue which confirms this singularity. Also the determinant gives a numerical zero value.
> eig(A)
ans =
2.5108 + 0.0000i
-0.0000 + 0.0000i
0.5726 + 0.3574i
0.5726 - 0.3574i
>> abs(det(A)) < eps
ans =
logical
1
Conclusion: I can not conclude from P=0 in chol that the matrix is Positive definite.
Is there an error in this function, in the documentation or I am missing/misunderstanding something ?
I appreciate your help with this, dear MATLAB users.

Best Answer

For the 10 millionth time, det is a bad way to check is a matrix is singular. (Not your fault for asking though.) In fact, it is NEVER a good way to do so, except in homework, where teachers love to tell you to use det, but not explain why det is bad so often. Sadly, that propagates, because their students will do the same thing. And if nobody ever tells you, then your potential students would learn the same fallacies.
Next, giving us a matrix of elements that are only written in 9 decimal digits of precision for a matrix of doubles tells us nothing.
You are confusing the use of chol to test for a positive definite matrix, with testing for singularity. As well, the matrix you have shown is not even symmetric. That tells me it will usually have complex eigenvalues.
I am a bit surprised that chol does not test to see if the metrix is symmetric. But it looks as if chol only uses the upper triangle of the input array. We can verify that by the following test:
[R,P] = chol(A);
A - R'*R
ans =
1.1102e-16 5.5511e-17 1.1102e-16 1.1102e-16
0.063614 0 6.9389e-18 6.9389e-18
0.14454 0.7565 0 0
-0.51385 0.92378 0.084864 0
So chol is indeed only looking at the upper triangle. (I think that chol used to test for symmetry too. So that may have changed in some recent release.)
If you want to test to see if A is SINGULAR, NEVER use det. Chol is completely inappropriate too.
rank(A)
ans =
3
A non-singular 4x4 matrix would have a rank of 4. So A is rank deficient.
Understanding the SVD would be even better for some people, but rank is perfectly adequate in this respect.