# NAME

diagonalize_symmetric - Diagonalizes a symmetric matrix
# SYNOPSIS

#include "n/n_diagonalize.h"
Example compile flags (system dependent):
-DLINUX_X86_64 -DLINUX_X86_64_OPTERON -DGNU_COMPILER
-I/home/kobus/include
-L/home/kobus/misc/load/linux_x86_64_opteron -L/usr/lib/x86_64-linux-gnu
-lKJB -lfftw3 -lgsl -lgslcblas -ljpeg -lSVM -lstdc++ -lpthread -lSLATEC -lg2c -lacml -lacml_mv -lblas -lg2c -lncursesw
int diagonalize_symmetric
(
const Matrix *mp,
Matrix **E_mpp,
Vector **D_vpp
);

# DESCRIPTION

Given a symmetric matrix A, this routine computes A = E*D*inv(E), where D is
diagonal, and contains the eigenvalues of A, and the columns of E contain the
eigenvectors. Since A is symmetric, everything is real. If only the
eigenvalues are needed, E_mpp can be set to NULL.
The matrix of eigenvectors is put into the matrix pointed to by *E_mpp,
which is created or resized as needed. The diagonal matrix of eigenvalues is
put into the vector pointed to by *D_vpp, which is also created or
resized as needed.
For development code (compiled with -DTEST), this routine prints a warning if
the matrix is non symmetric (outside a threshold). For computing the
eigenvalues, only the upper triangular part of the matrix is used.
# RETURNS

NO_ERROR on success, and ERROR on failure, with an appropriate error
message being set.
# NOTE

This routine sorts the eigenvalues and eigenvectors from largest to
smallest (opposite of Matlab). Also, the matrix of eigenvectors is
ambigous up to a sign, so if you compare the results with other
eigensolvers, you may have to multiply one of the results by -1.
# NOTE

This routine requires that that the LAPACK library is available. If this
file was compiled without the presence of that library, then this routine
will return ERROR.
# DISCLAIMER

This software is not adequatedly tested. It is recomended that
results are checked independantly where appropriate.
# AUTHOR

Kobus Barnard
# DOCUMENTER

Kobus Barnard
# SEE ALSO

diagonalize
,
diagonalize_2