70 Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>& vectors,
79 int np = dim*(dim+1)/2;
85 for(
int i = 0; i < np; ++i)
86 if (std::fabs(mat[i]) > std::fabs(mat[maxi]))
90 scale = 1.0/mat[maxi];
93 MatrixXd dmat_full = MatrixXd::Zero(dim,dim);
95 for (
int i = 0; i < dim; ++i) {
96 for(
int j = 0; j <= i; ++j) {
97 double val = mat[idx]*scale;
103 SelfAdjointEigenSolver<MatrixXd> es;
104 es.compute(dmat_full);
108 lambda = es.eigenvalues() * scale;
109 vectors = es.eigenvectors().transpose().cast<
float>();
204 VectorXd lambda_local;
205 Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> local_eigen;
207 double magscale,gradscale,eegscale;
208 int nmag,ngrad,neeg,nok;
215 qCritical(
"Channels not classified. Rank cannot be determined.");
218 magscale = gradscale = eegscale = 0.0;
219 nmag = ngrad = neeg = 0;
220 for (k = 0; k <
ncov; k++) {
222 magscale += this->
cov[lt_packed_index(k,k)]; nmag++;
225 gradscale += this->
cov[lt_packed_index(k,k)]; ngrad++;
228 eegscale += this->
cov[lt_packed_index(k,k)]; neeg++;
235 fprintf(stdout,
"\n");
238 magscale = magscale > 0.0 ? sqrt(nmag/magscale) : 0.0;
240 gradscale = gradscale > 0.0 ? sqrt(ngrad/gradscale) : 0.0;
242 eegscale = eegscale > 0.0 ? sqrt(neeg/eegscale) : 0.0;
244 fprintf(stdout,
"%d %g\n",nmag,magscale);
245 fprintf(stdout,
"%d %g\n",ngrad,gradscale);
246 fprintf(stdout,
"%d %g\n",neeg,eegscale);
248 scale_vec.resize(
ncov);
249 for (k = 0; k <
ncov; k++) {
251 scale_vec[k] = magscale;
253 scale_vec[k] = gradscale;
255 scale_vec[k] = eegscale;
260 lambda_local.resize(
ncov);
262 for (j = 0; j <
ncov; j++)
263 for (k = 0; k <= j; k++)
264 cov_local[lt_packed_index(j,k)] = this->
cov[lt_packed_index(j,k)]*scale_vec[j]*scale_vec[k];
267 for (k = 0; k <
ncov; k++)
268 fprintf(stdout,
"%g ",lambda_local[k]/lambda_local[
ncov-1]);
269 fprintf(stdout,
"\n");
272 for (k =
ncov-1; k >= 0; k--) {
273 if (lambda_local[k] >= rank_threshold*lambda_local[
ncov-1])
278 printf(
"\n\tEstimated covariance matrix rank = %d (%g)\n",nok,lambda_local[
ncov-nok]/lambda_local[
ncov-1]);
279 if (use_rank > 0 && use_rank < nok) {
281 printf(
"\tUser-selected covariance matrix rank = %d (%g)\n",nok,lambda_local[
ncov-nok]/lambda_local[
ncov-1]);
286 for (j = 0; j <
ncov-nok; j++)
287 lambda_local[j] = 0.0;
289 for (j = 0; j <
ncov; j++) {
291 mne_print_vector(stdout,NULL,local_eigen.row(j).data(),
ncov);
293 for (k = 0; k <
ncov; k++)
294 data1(j,k) = sqrt(lambda_local[j])*local_eigen(j,k);
296 MatrixXd data2 = data1.transpose() * data1;
299 for (j = 0; j <
ncov; j++)
300 mne_print_dvector(stdout,NULL,data2.row(j).data(),
ncov);
306 for (k = 0; k <
ncov; k++)
307 if (scale_vec[k] > 0.0)
308 scale_vec[k] = 1.0/scale_vec[k];
309 for (j = 0; j <
ncov; j++)
310 for (k = 0; k <= j; k++)
311 if (this->
cov[lt_packed_index(j,k)] != 0.0)
312 this->
cov[lt_packed_index(j,k)] = scale_vec[j]*scale_vec[k]*data2(j,k);
int mne_decompose_eigen(const VectorXd &mat, VectorXd &lambda, Eigen::Matrix< float, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor > &vectors, int dim)
MNECovMatrix(int p_kind, int p_ncov, const QStringList &p_names, const Eigen::VectorXd &p_cov, const Eigen::VectorXd &p_cov_diag, FIFFLIB::FiffSparseMatrix *p_cov_sparse)