Beispiel #1
0
bool Matrix::eig(vector<double> &eigval,Matrix *eigvec){
	bool flag = false;
	if(this->rows!=this->cols){
		cout<<"Inappropriate Input Matrix! Only SQUARE Matrix Permitted In EIGEN Calculating"<<endl;
		return false;
	}
	int size = rows;
	valarray<double> main_diag(size), minor_diag(size);
	Matrix q(size,size);
	Matrix digenvalue(size,size);
	digenvalue.setdata(data);
	double accuracy = 1.0e-8;	
	int k=Householder(digenvalue,q,main_diag,minor_diag);
	if(k==0){
		cout<<"The Matrix is not SYMMETRICAL"<<endl; 
		return false;
	}
	k = QR(main_diag,minor_diag,q,accuracy,160);
	if(k<0){
		cout<<"Calculating failed in Required Iteration Times"<<endl; 
		return false;
	}
	vector<int> id;
	sortArray(main_diag,id);			
	for(int j=0;j<size;j++)
		eigval.push_back(main_diag[j]);
	q = q.sort(id,2);
	*eigvec = q;
	flag = true;
	return flag;
}
Beispiel #2
0
void ExplicitTriang( ElementalMatrix<F>& A )
{
    DEBUG_ONLY(CSE cse("rq::ExplicitTriang"))
    DistMatrix<F,MD,STAR> t(A.Grid());
    DistMatrix<Base<F>,MD,STAR> d(A.Grid());
    Householder( A, t, d );
    MakeTrapezoidal( UPPER, A, A.Width()-A.Height() );
}
Beispiel #3
0
void ExplicitTriang( Matrix<F>& A )
{
    DEBUG_ONLY(CSE cse("rq::ExplicitTriang"))
    Matrix<F> t;
    Matrix<Base<F>> d;
    Householder( A, t, d );
    MakeTrapezoidal( UPPER, A, A.Width()-A.Height() );
}
Beispiel #4
0
void ExplicitTriang( AbstractDistMatrix<F>& A )
{
    DEBUG_ONLY(CallStackEntry cse("rq::ExplicitTriang"))
    DistMatrix<F,MD,STAR> t(A.Grid());
    DistMatrix<Base<F>,MD,STAR> d(A.Grid());
    Householder( A, t, d );
    MakeTrapezoidal( UPPER, A, A.Width()-A.Height() );
}
inline void
Householder( Matrix<F>& A )
{
#ifndef RELEASE
    CallStackEntry entry("qr::Householder");
#endif
    Matrix<F> t;
    Householder( A, t );
}
inline void
Householder( DistMatrix<F>& A )
{
#ifndef RELEASE
    CallStackEntry entry("qr::Householder");
#endif
    DistMatrix<F,MD,STAR> t(A.Grid());
    Householder( A, t );
}
Beispiel #7
0
void ExplicitTriang( AbstractDistMatrix<F>& A, const QRCtrl<Base<F>>& ctrl )
{
    DEBUG_ONLY(CallStackEntry cse("qr::ExplicitTriang"))
    DistMatrix<F,MD,STAR> t(A.Grid());
    DistMatrix<Base<F>,MD,STAR> d(A.Grid());
    if( ctrl.colPiv )
    {
        DistMatrix<Int,VC,STAR> p(A.Grid());
        BusingerGolub( A, t, d, p, ctrl );
    }
    else
        Householder( A, t, d );

    A.Resize( t.Height(), A.Width() );
    MakeTrapezoidal( UPPER, A );
}
Beispiel #8
0
void ExplicitTriang( Matrix<F>& A, const QRCtrl<Base<F>>& ctrl )
{
    DEBUG_ONLY(CallStackEntry cse("qr::ExplicitTriang"))
    Matrix<F> t;
    Matrix<Base<F>> d;
    if( ctrl.colPiv )
    {
        Matrix<Int> p;
        BusingerGolub( A, t, d, p, ctrl );
    }
    else
        Householder( A, t, d );

    A.Resize( t.Height(), A.Width() );
    MakeTrapezoidal( UPPER, A );
}
Beispiel #9
0
void ExplicitTriang( ElementalMatrix<F>& A, const QRCtrl<Base<F>>& ctrl )
{
    DEBUG_CSE
    DistMatrix<F,MD,STAR> householderScalars(A.Grid());
    DistMatrix<Base<F>,MD,STAR> signature(A.Grid());
    if( ctrl.colPiv )
    {
        DistPermutation Omega(A.Grid());
        BusingerGolub( A, householderScalars, signature, Omega, ctrl );
    }
    else
        Householder( A, householderScalars, signature );

    A.Resize( householderScalars.Height(), A.Width() );
    MakeTrapezoidal( UPPER, A );
}
Beispiel #10
0
void ExplicitTriang( Matrix<F>& A, const QRCtrl<Base<F>>& ctrl )
{
    DEBUG_CSE
    Matrix<F> householderScalars;
    Matrix<Base<F>> signature;
    if( ctrl.colPiv )
    {
        Permutation Omega;
        BusingerGolub( A, householderScalars, signature, Omega, ctrl );
    }
    else
        Householder( A, householderScalars, signature );

    A.Resize( householderScalars.Height(), A.Width() );
    MakeTrapezoidal( UPPER, A );
}
Beispiel #11
0
void ExplicitTriang( ElementalMatrix<F>& A, const QRCtrl<Base<F>>& ctrl )
{
    DEBUG_ONLY(CSE cse("qr::ExplicitTriang"))
    DistMatrix<F,MD,STAR> t(A.Grid());
    DistMatrix<Base<F>,MD,STAR> d(A.Grid());
    if( ctrl.colPiv )
    {
        DistPermutation Omega(A.Grid());
        BusingerGolub( A, t, d, Omega, ctrl );
    }
    else
        Householder( A, t, d );

    A.Resize( t.Height(), A.Width() );
    MakeTrapezoidal( UPPER, A );
}
Beispiel #12
0
void ExplicitTriang( Matrix<F>& A, const QRCtrl<Base<F>>& ctrl )
{
    DEBUG_ONLY(CSE cse("qr::ExplicitTriang"))
    Matrix<F> t;
    Matrix<Base<F>> d;
    if( ctrl.colPiv )
    {
        Permutation Omega;
        BusingerGolub( A, t, d, Omega, ctrl );
    }
    else
        Householder( A, t, d );

    A.Resize( t.Height(), A.Width() );
    MakeTrapezoidal( UPPER, A );
}
Beispiel #13
0
int
eig( int N,  const lower_triangular_matrix& C, valarray<double>& diag, square_matrix& Q,
       int niter)
{
  int ret;
  int i, j;

  if (niter == 0) niter = 30*N;

  for (i=0; i < N; ++i)
  {
      vector<double>::const_iterator row = C[i];
      for (j = 0; j <= i; ++j)
          Q[i][j] = Q[j][i] = row[j];
  }

  double* rgtmp = new double[N+1];
  Householder( N, Q, diag, rgtmp);
  ret = QLalgo( N, diag, Q, niter, rgtmp+1);
  delete [] rgtmp;

  return ret;
}
Beispiel #14
0
/* ========================================================= */
static void Eigen( int N,  double **C, double *diag, double **Q, double *rgtmp)
/* 
 * Calculating eigenvalues and vectors. 
 * Input: 
 *  N: dimension.
 *  C: symmetric (1:N)xN-matrix, solely used to copy data to Q
 *  niter: number of maximal iterations for QL-Algorithm. 
 *  rgtmp: N+1-dimensional vector for temporal use. 
 * Output: 
 *  diag: N eigenvalues. 
 *  Q: Columns are normalized eigenvectors.
 */
{
	int i, j;
	
	if (rgtmp == NULL){ /* was OK in former versions */
		//FATAL("cmaes_t:Eigen(): input parameter double *rgtmp must be non-NULL", 0,0,0);
		fprintf(stderr,"cmaes_t:Eigen(): input parameter double *rgtmp must be non-NULL");
		exit(1);
	}
	
	/* copy C to Q */
	if (C != Q) {
		for (i=0; i < N; ++i)
			for (j = 0; j <= i; ++j)
				Q[i][j] = Q[j][i] = C[i][j];
	}
	
	#if 0
	Householder( N, Q, diag, rgtmp);
	QLalgo( N, diag, Q, 30*N, rgtmp+1);
	#else
	Householder2( N, Q, diag, rgtmp);
	QLalgo2( N, diag, rgtmp, Q);
	#endif
}