void CPDNRigid<Scalar, Dim>::initialization()
    {

        paras_.W_ = MatrixType<Scalar, Dim>::Matrix::Zero(this->M_, Dim);

        Scalar sigma_sum = this->M_*(this->data_.transpose()*this->data_).trace() + 
            this->N_*(this->model_.transpose()*this->model_).trace() - 
            2*(this->data_.colwise().sum())*(this->model_.colwise().sum()).transpose();
        paras_.sigma2_ = sigma_sum / (Dim*this->N_*this->M_);

        this->initTransform();
        constructG();
        
        if (this->lr_)
            lr_approximate<Scalar, Dim>(G_, Q_, S_, this->K_, this->lr_maxitr_);
    }
    void CPDNRigid<T, D>::initialization()
    {

        _paras._W = TMatrix::Zero(_M, D);

        T sigma_sum = _M*(_data.transpose()*_data).trace() + 
            _N*(_model.transpose()*_model).trace() - 
            2*(_data.colwise().sum())*(_model.colwise().sum()).transpose();
        _paras._sigma2 = sigma_sum / (D*_N*_M);

        initTransform();
        constructG();
        
        if (_lr)
            lr_approximate<T, D>(_G, _Q, _S, _K, _lr_maxitr);
    }
		BallSearch(Params<Complex> params_) :params(params_), G(constructG(params)), g(~G), m_foundBigBall(false) {}