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

14 vues (au cours des 30 derniers jours)
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.

Réponse acceptée

John D'Errico
John D'Errico le 22 Mar 2018
Modifié(e) : John D'Errico le 22 Mar 2018
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.
  6 commentaires
Steven Lord
Steven Lord le 22 Mar 2018
John wrote "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." That's almost correct. From the first line in the Description section on the documentation page for chol:
" R = chol(A) produces an upper triangular matrix R from the diagonal and upper triangle of matrix A, satisfying the equation R'*R=A."
The third paragraph in the Description section of that page covers the two output syntax:
" [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."
chol uses the upper triangle and the main diagonal. So while the matrix the asker passed into chol was not positive definite, the matrix whose Cholesky factorization chol computed was.
Juan Diego Quesada
Juan Diego Quesada le 22 Mar 2018
Very clear explanation. I appreciate you took the time to help me with these questions. I have accepted your answer.

Connectez-vous pour commenter.

Plus de réponses (1)

Zheng
Zheng le 29 Août 2022
Thanks John!
I have also encountered this problem when studying "chol()" and luckily found someone else has realized this. What's more, I found that Chol will behave quite differently towards two similar matrices even if we do not consider decimal digits. I have tried some examples and wrote down here. My current version is Matlab r2022a.
The base matrix is just the first example from the Chol help documents.
A = [1 0 1; 0 2 0; 1 0 3]
A = 3×3
1 0 1 0 2 0 1 0 3
  • 1. If we change the element in A(3,1) to any other number except "1", for instance "1000", Chol will always regard this matrix as positive definite and return "flag = 0"
A1 = [1 0 1; 0 2 0; 1000 0 3]
A1 = 3×3
1 0 1 0 2 0 1000 0 3
[R1,flag1] = chol(A1)
R1 = 3×3
1.0000 0 1.0000 0 1.4142 0 0 0 1.4142
flag1 = 0
  • 2. However, if we change the element in A(1,3) to any other number except "1", for instance "2", Chol will always correctly detect non-positive definite matrix and return non-zero values.
A2 = [1 0 2; 0 2 0; 1 0 3]
A2 = 3×3
1 0 2 0 2 0 1 0 3
[R2,flag2] = chol(A2)
R2 = 2×2
1.0000 0 0 1.4142
flag2 = 3
  4 commentaires
Zheng
Zheng le 29 Août 2022
Ah I think I found the reason.
The second example, A2, could not be positive definite under this case even if Chol only uses the upper triangular part of A2. Symmetry is just a necessary condition...
Steven Lord
Steven Lord le 29 Août 2022
if I am right, while Chol treat them differently.
Yes, that is correct and is the correct behavior. The chol function ignores the lower triangular part of the input entirely unless you explicitly specify the second input as 'lower' to tell it to ignore the upper triangular part instead.
From the description of the A input argument in the documentation page to which I linked in my previous comment: "chol assumes that A is symmetric for real matrices or Hermitian for complex matrices. chol uses only the upper or lower triangle of A to perform its computations, depending on the value of triangle." [Emphasis added.]

Connectez-vous pour commenter.

Catégories

En savoir plus sur Linear Algebra dans Help Center et File Exchange

Produits

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by