Date: Feb 27, 2013 5:44 PM
Author: Tony Kittler
Subject: Re: Alternative solution for NAN
"Steven_Lord" <firstname.lastname@example.org> wrote in message <email@example.com>...
> "Carl S." <firstname.lastname@example.org> wrote in message
> > "Torsten" wrote in message <email@example.com>...
> >> The matrix N you get after the while loop is a scalar multiple of the
> >> identity matrix and in general has nothing in common with your original
> >> matrix N. You will have to find out why eig produces NaN values for your
> >> original matrix N. Are you sure all elements of N are finite ? Best
> >> wishes
> >> Torsten.
> > Yes, Torsten, they are finite
> > My goal is to fit means(mu) and standard deviations(N) to Gaussian shape.
> > The codes that I wrote above are from the function ;
> > function res=MultivariateGaussianPDF(x,mu,N)
> > while(det(N) == 0)
> 1) Don't use DET to test for singularity. This matrix:
> A = 1e-10*eye(400);
> has determinant 0 (due to underflow) but it's a scaled identity matrix,
> which is about as well-behaved as you can get. If you _must_ test for
> singularity, check with COND or RCOND.
> 2) Don't test a floating-point number for exact, bit-for-bit equality unless
> you need exact, bit-for-bit equality. Compare with a tolerance instead.
> > N=(1e-10.*randi(1,size(N)))*eye(size(N));
> > end
> > [M,d]=size(x);
> > [U,D]=eig(N); % <=causes NAN problem :((
> Show the group a SMALL matrix N with which you can reproduce this behavior.
> 3) If you have Statistics Toolbox, do one of these functions do what you
> If not, please explain more _in words not code or equations_ specifically
> what you mean/are trying to do when you say you want to fit means and
> standard deviations to a Gaussian shape.
> Steve Lord
> To contact Technical Support use the Contact Us link on
Thanks Steven and Torsten,
(It is difficult to prepare a small group of matrix N. I am trying to find likelihood of an image. Codes are working for many images, but gives this NAN error for some of them)
I examined all codes again and saw that the error is due to the non-positive definite values of N. So, I wrote that
if D ~= 0 % <= if N not positive definite
positivedefiniteN = topdm(N); %<=topdm converts N to a positive definite matrix
[U,D]= chol(positivedefiniteN );
(For topdm function, the link is http://www.mathworks.com/matlabcentral/fileexchange/35938-converts-a-non-positive-definite-symmetric-matrix-to-positive-definite-symmetric-matrix/content/topdm.m)
But, the value of D returns zero therefore
returns NAN and inf values, since, inv(D)=inf
I have tried this
nonsingularD = pinv(D);
but nonsingularD is equal to zero, so it does not solve this problem