It is often required to check if a given matrix is positive definite or not. Three methods to check the positive definiteness of a matrix were discussed in a previous article .
I will utilize the test method 2 to implement a small matlab code to check if a matrix is positive definite.The test method 2 relies on the fact that for a positive definite matrix, the determinants of all upper-left sub-matrices are positive.The following Matlab code uses an inbuilt Matlab function -‘det’ – which gives the determinant of an input matrix.
Furthermore, the successive upper \(k \times k\) sub-matrices are got by using the following notation
subA=A(1:i,1:i)
I will explain how this notation works to give the required sub-matrices.
Consider a sample matrix given below
$$ \begin{bmatrix} 1 & 2 & 3\\ 4 & 5 & 6\\ 7 & 8 & 9 \end{bmatrix}$$
The sub-matrices for the various combinations for row and column values for the above mentioned code snippet is given below
Notation | Submatrix | Comment |
---|---|---|
subA=A(1:1,1:1) | \( \begin{bmatrix} 1 \end{bmatrix}\) | Select elements from 1st row-1st column to 1st row-1st column |
subA=A(1:2,1:2) | \( \begin{bmatrix} 1 & 2 \\ 4 & 5 \end{bmatrix}\) | Select elements from 1st row-1st column to 2nd row-2nd column |
subA=A(1:3,1:3) | \( \begin{bmatrix} 1 & 2 & 3\\ 4 & 5 & 6 \\ 7 & 8 & 9\end{bmatrix}\) | Select elements from 1st row-1st column to 3rd row-3rd column |
subA=A(1:3,1:2) | \( \begin{bmatrix} 1 & 2 \\ 4 & 5 \\ 7 & 8 \end{bmatrix}\) | Select elements from 1st row-1st column to 3rd row-2nd column |
Matlab Code to test if a matrix is positive definite:
function x=isPositiveDefinite(A) %Function to check whether a given matrix A is positive definite %Author Mathuranathan for https://www.gaussianwaves.com %Returns x=1, if the input matrix is positive definite %Returns x=0, if the input matrix is not positive definite %Throws error if the input matrix is not symmetric %Check if the matrix is symmetric [m,n]=size(A); if m~=n, error('A is not Symmetric'); end %Test for positive definiteness x=1; %Flag to check for positiveness for i=1:m subA=A(1:i,1:i); %Extract upper left kxk submatrix if(det(subA)<=0); %Check if the determinent of the kxk submatrix is +ve x=0; break; end end if x display('Given Matrix is Positive definite'); else display('Given Matrix is NOT positive definite'); end end
Sample run:
>> A=[1 2 3; 4 5 6; 7 8 9]
\(A =\begin{bmatrix}
1 & 2 & 3\\
4 & 5 & 6\\
7 & 8 & 9\end{bmatrix}\)
>> x=isPositiveDefinite(A)
Given Matrix is NOT positive definite
x = 0
------------------------------------------
>> A=[25 15 -5; 15 18 0;-5 0 11]
\(A =\begin{bmatrix}
25 & 15 & -5\\
15 & 18 & 0\\
-5 & 0 & 11 \end{bmatrix}\)
>> x=isPositiveDefinite(A)
Given Matrix is Positive definite
x = 1
------------------------------------------
>> A=[1 2 3; 4 5 6]
\(A =\begin{bmatrix}
1 & 2 & 3\\
4 & 5 & 6 \end{bmatrix}\)
>> x=isPositiveDefinite(A)
Error using isPositiveDefinite (line 11)
A is not Symmetric
------------------------------------------