ECG-Kit 1.0

File: <base>/common/prtools/private/pd_check.m (1,098 bytes)
%PD_CHECK Check whether the input matrix is positive definite
%
%  OK = PD_CHECK(A)
%
% INPUT
%   A   Symmetric matrix
%
% OUTPUT
%   OK  1/0 to indicate whether A is positive definite
%
% DESCRIPTION
% Symmetric matrix A is positive definite, if the diagonal of A is 
% dominant, i.e. A(i,i) > sum_{j ~= i}  A(i,j).
% Based on Golub's version of Cholesky, with non-positivity test.
%
% REFERENCES
% G. Golub and C.V. Loan, Matrix Computations, The Johns Hopkins 
% University Press, Baltimore, 1989.

% $Id: pd_check.m,v 1.2 2006/03/08 22:06:58 duin Exp $

function ok = pd_check(a)

	% Check now added.
	if ~issym(a),
		error('A is not symmetric.');
	end

	n   = size(a,1); 
	ok  = 0; 
	tol = 1e-15;
	for j = 1:n
    if (j > 1)
			a(j:n,j) = a(j:n,j) - a(j:n,1:j-1) * a(j,1:j-1)';
		end
    if (a(j,j) < tol) 
			return;
		end
    a(j:n,j) = a(j:n,j) / sqrt(a(j,j));
	end
	ok = 1;   

%EP??? I am not sure how to understand the lines below.
	% ok = 1 if a is safely pos.def, ie each diag > tol in chol.faktor
	% otherwise ok = 0;
	%G = tril(a);  This could be used as a Cholesky factor.

return;