Does the function chol correctly indicates that a Matrix is positive definite ?
    14 vues (au cours des 30 derniers jours)
  
       Afficher commentaires plus anciens
    
    Juan Diego Quesada
 le 22 Mar 2018
  
    
    
    
    
    Commenté : Steven Lord
    
      
 le 29 Août 2022
            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.
0 commentaires
Réponse acceptée
  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
    
      
 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.
Plus de réponses (1)
  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]
- 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]
[R1,flag1] = chol(A1)
- 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]
[R2,flag2] = chol(A2)
4 commentaires
  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
    
      
 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.]
Voir également
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!