60 using namespace Eigen;
81 : kind(p_FiffProj.kind)
82 , active(p_FiffProj.active)
83 , desc(p_FiffProj.desc)
84 , data(p_FiffProj.data)
115 QList<FiffProj>::Iterator it;
116 for(it = p_qListFiffProj.begin(); it != p_qListFiffProj.end(); ++it)
119 printf(
"\t%d projection items activated.\n", p_qListFiffProj.size());
125 fiff_int_t
FiffProj::make_projector(
const QList<FiffProj>& projs,
const QStringList& ch_names, MatrixXd& proj,
const QStringList& bads, MatrixXd& U,
bool include_active)
127 fiff_int_t nchan = ch_names.size();
130 printf(
"No channel names specified\n");
136 proj = MatrixXd::Identity(nchan,nchan);
137 fiff_int_t nproj = 0;
143 if (projs.size() == 0)
148 for (k = 0; k < projs.size(); ++k)
150 if (!projs[k].
active || include_active)
153 nvec += projs[k].data->nrow;
163 MatrixXd vecs = MatrixXd::Zero(nchan,nvec);
165 fiff_int_t nonzero = 0;
166 qint32 p, c, i, j, v;
169 RowVectorXi sel(nchan);
170 RowVectorXi vecSel(nchan);
172 vecSel.setConstant(-1);
173 for (k = 0; k < projs.size(); ++k)
175 if (!projs[k].
active || include_active)
179 QMap<QString, int> uniqueMap;
180 for(l = 0; l < one.
data->col_names.size(); ++l)
181 uniqueMap[one.
data->col_names[l] ] = 0;
183 if (one.
data->col_names.size() != uniqueMap.keys().size())
185 printf(
"Channel name list in projection item %d contains duplicate items",k);
194 vecSel.resize(nchan);
196 vecSel.setConstant(-1);
198 for (c = 0; c < nchan; ++c)
200 for (i = 0; i < one.
data->col_names.size(); ++i)
202 if (QString::compare(ch_names.at(c),one.
data->col_names[i]) == 0)
205 for (j = 0; j < bads.size(); ++j)
207 if (QString::compare(ch_names.at(c),bads.at(j)) == 0)
213 if (!isBad && sel[p] != c)
223 sel.conservativeResize(p);
224 vecSel.conservativeResize(p);
229 for (v = 0; v < one.
data->nrow; ++v)
230 for (i = 0; i < p; ++i)
231 vecs(sel[i],nvec+v) = one.
data->data(v,vecSel[i]);
236 for (v = 0; v < one.
data->nrow; ++v)
238 onesize = sqrt((vecs.col(nvec+v).transpose()*vecs.col(nvec+v))(0,0));
241 vecs.col(nvec+v) = vecs.col(nvec+v)/onesize;
245 nvec += one.
data->nrow;
257 JacobiSVD<MatrixXd> svd(vecs.block(0,0,vecs.rows(),nvec), ComputeFullU);
259 VectorXd S = svd.singularValues();
260 MatrixXd t_U = svd.matrixU();
261 MNEMath::sort<double>(S, t_U);
267 for(k = 0; k < S.size(); ++k)
268 if (S[k]/S[0] > 1e-2)
271 U = t_U.block(0, 0, t_U.rows(), nproj);
276 proj -= U*U.transpose();
FiffProj class declaration.
static void activate_projs(QList< FiffProj > &p_qListFiffProj)
FiffNamedMatrix::SDPtr data
static fiff_int_t make_projector(const QList< FiffProj > &projs, const QStringList &ch_names, MatrixXd &proj, const QStringList &bads=defaultQStringList, MatrixXd &U=defaultMatrixXd, bool include_active=true)
MNEMath class declaration.