48template<
class SquareArray>
class SymEigen;
56template<
class SquareArray_>
84template<
class SquareArray>
107 template<
class Derived>
143template<
class SquareArray>
149template<
class SquareArray>
165template<
class SquareArray>
166template<
class Derived>
171template<
class SquareArray>
176template<
class SquareArray>
179#ifdef STK_ALGEBRA_VERBOSE
180 stk_cout <<
_T(
"Entering in SymEigen::run()\n");
185 eigenValues_.resize(eigenVectors_.range());
189#ifdef STK_ALGEBRA_VERBOSE
190 stk_cout <<
_T(
"calling SymEigen::tridiagonalize()\n");
194#ifdef STK_ALGEBRA_VERBOSE
195 stk_cout <<
_T(
"calling SymEigen::compHouse()\n");
199#ifdef STK_ALGEBRA_VERBOSE
200 stk_cout <<
_T(
"calling SymEigen::diagonalize()\n");
204#ifdef STK_ALGEBRA_VERBOSE
205 stk_cout <<
_T(
"calling SymEigen::finalize()\n");
222template<
class SquareArray>
226 F_.resize(
Range(range_.begin()-1, range_.lastIdx(), 0));
227 F_.front() = 0.0; F_.back() =0.0;
233 for (
int i=range_.begin(),
i1=range_.begin()+1,
i2=range_.begin()+2;
i<range_.lastIdx()
242 eigenValues_[
i] = eigenVectors_(
i,
i);
244 Real beta =
v.front();
257 for (
int k=
i2; k<range_.end(); k++)
262 for (
int j=
i2;
j<=k;
j++) {
aux += eigenVectors_(k,
j)*
v[
j];}
263 for (
int j=k+1;
j<range_.end();
j++) {
aux += eigenVectors_(
j,k)*
v[
j];}
265 aux1 += (eigenValues_[k] = beta*
aux) *
v[k];
273 for (
int k=
i2; k<range_.end(); k++)
276 eigenValues_[k] +=
aux1 *
v[k];
279 M1[k] += eigenValues_[k] +
v[k] *
aux;
281 for (
int j=
i2;
j<=k;
j++)
282 eigenVectors_(k,
j) +=
v[
j] * eigenValues_[k] +
v[k] * eigenValues_[
j];
287 eigenValues_[range_.lastIdx()] = eigenVectors_(range_.lastIdx(),range_.lastIdx());
291template<
class SquareArray>
297 for (
int iter0=range_.lastIdx()-1, iter=range_.lastIdx(),
iter1=range_.lastIdx()+1
298 ;
iter0>=range_.begin()
308 eigenVectors_(iter, iter) = 1.0 + beta ;
309 for (
int i=
iter1;
i<range_.end();
i++)
310 { eigenVectors_(
i, iter) = beta *
v[
i];}
313 for (
int i=
iter1;
i<range_.end();
i++)
317 for (
int j=
iter1;
j<range_.end();
j++)
318 {
aux += eigenVectors_(
j,
i) *
v[
j]; }
321 eigenVectors_(iter,
i) =
aux;
323 for (
int j=
iter1;
j<range_.end();
j++)
324 { eigenVectors_(
j,
i) +=
aux *
v[
j];}
328 { eigenVectors_(iter,iter)=1.0;
329 for (
int j=
iter1;
j<range_.end();
j++)
330 { eigenVectors_(iter,
j) =0.0; eigenVectors_(
j, iter) = 0.0;}
334 eigenVectors_(range_.begin(), range_.begin()) = 1.0;
335 for (
int j=range_.begin()+1;
j<range_.end();
j++)
336 { eigenVectors_(range_.begin(),
j) = 0.0; eigenVectors_(
j, range_.begin()) = 0.0;}
340template<
class SquareArray>
344 for (
int iend=range_.lastIdx();
iend>=range_.begin()+1;
iend--)
347 for (iter=0; iter<
MAXITER; iter++)
350 Real sum = std::abs(eigenValues_[
iend]) + std::abs(eigenValues_[
iend-1]);
354 { F_[
iend-1] = 0.0 ;
break;}
357 while (
ibeg>range_.begin())
362 if (std::abs(F_[
ibeg])+std::abs(eigenValues_[
ibeg]) == std::abs(eigenValues_[
ibeg]))
383 if (
z == 0.0) { F_[k]=
Fk;
break;}
399 eigenValues_[k] +=
DeltaDk ; F_[k-1] =
y;
404 { this->
msg_error_ =
_T(
"Warning, max iteration reached in SymEigen::diagonalize()\n");}
407 for (
int i=
iend+1;
i<eigenValues_.end();
i++)
408 {
if (eigenValues_[
i] >
z)
409 { eigenValues_.swap(
i-1,
i);
410 eigenVectors_.swapCols(
i-1,
i);
416 Real z = eigenValues_[range_.begin()];
417 for (
int i=range_.begin()+1;
i<eigenValues_.end();
i++)
418 {
if (eigenValues_[
i] >
z)
420 eigenValues_.swap(
i-1,
i);
421 eigenVectors_.swapCols(
i-1,
i);
A Array2DVector is a one dimensional horizontal container.
In this file we define Givens methods used by the Algebra classes.
In this file we define the Housholder methods used by the Algebra classes.
In this file we define the ISymEigen class (for a symmetric matrix).
#define stk_cout
Standard stk output stream.
#define _T(x)
Let x unmodified.
Sdk class for all library Exceptions.
virtual const String error() const
Returns a C-style character string describing the general cause of the current error.
virtual bool finalizeStep()
perform any computation needed after the call of the regression method.
String msg_error_
String with the last error message.
The class ISymEigen is an interface class for the method computing the eigenvalue Decomposition of a ...
hidden::AlgebraTraits< Derived >::SquareArray SquareArray
Range range_
range of the original data set.
CArrayVector< Type, size_ > eigenValues_
Array of the eigenvalues.
ISymEigen & operator=(ISymEigen const &eigen)
Operator = : overwrite the ISymEigen with eigen.
CArraySquare< Type, size_ > eigenVectors_
Square matrix or the eigenvectors.
The MultidimRegression class allows to regress a multidimensional output variable among a multivariat...
The class SymEigen compute the eigenvalue Decomposition of a symmetric ArrayXX.
void tridiagonalize()
compute the tri-diagonalization of eigenVectors_
bool runImpl()
Diagonalization of eigenVectors_.
ISymEigen< SymEigen< SquareArray > > Base
SymEigen(SymEigen const &S)
Copy constructor.
virtual ~SymEigen()
virtual destructor
void compHouse()
compute the Householder matrix and P
SymEigen & operator=(const SymEigen &S)
Operator = : overwrite the SymEigen with S.
VectorX F_
Temporary vector.
SymEigen(ExprBase< Derived > const &data)
constructor.
SymEigen(SquareArray const &data, bool ref=false)
Constructor.
void diagonalize()
computing the diagonalization of eigenValues_ and F_
SymEigen()
Default Constructor.
Index sub-vector region: Specialization when the size is unknown.
void rightGivens(ArrayBase< TContainer2D > &M, int j1, int j2, typename TContainer2D::Type const &cosinus, typename TContainer2D::Type const &sinus)
Apply Givens rotation.
Real house(ArrayBase< Vector > &x)
Compute the Householder vector v of a vector x.
Arrays::SumOp< Lhs, Rhs >::result_type sum(Lhs const &lhs, Rhs const &rhs)
convenience function for summing two arrays
Type sign(Type const &x, Type const &y=Type(1))
template sign value sign(x) * y: Type should be an integral type
Real norm(Real const &x, Real const &y)
Computation of sqrt(x^2 + y^2) without underflow or overflow.
double Real
STK fundamental type of Real values.
The namespace STK is the main domain space of the Statistical ToolKit project.
TRange< UnknownSize > Range
traits class for the algebra methods.