49 const QStringList& eogChannels)
54 m_vecEogIndices.clear();
55 m_vecTargetIndices.clear();
58 if (eogChannels.isEmpty()) {
60 for (
int i = 0; i < info.
chs.size(); ++i) {
62 m_vecEogIndices.append(i);
67 for (
const QString& name : eogChannels) {
68 int idx = info.
ch_names.indexOf(name);
70 m_vecEogIndices.append(idx);
72 qWarning() <<
"[EogRegression::fit] EOG channel not found:" << name;
77 if (m_vecEogIndices.isEmpty()) {
78 qWarning() <<
"[EogRegression::fit] No EOG channels found. Data will not be modified.";
85 for (
int i = 0; i < info.
chs.size(); ++i) {
86 if (!m_vecEogIndices.contains(i)) {
87 m_vecTargetIndices.append(i);
91 const int nEog = m_vecEogIndices.size();
92 const int nTargets = m_vecTargetIndices.size();
93 const int nTimes =
static_cast<int>(data.cols());
98 MatrixXd E(nEog, nTimes);
99 for (
int i = 0; i < nEog; ++i) {
100 E.row(i) = data.row(m_vecEogIndices[i]);
106 MatrixXd T(nTargets, nTimes);
107 for (
int i = 0; i < nTargets; ++i) {
108 T.row(i) = data.row(m_vecTargetIndices[i]);
117 MatrixXd EET = E * E.transpose();
118 MatrixXd ETT = E * T.transpose();
120 m_matBeta = EET.ldlt().solve(ETT).transpose();
133 qWarning() <<
"[EogRegression::apply] Not fitted yet. Call fit() first.";
137 const int nEog = m_vecEogIndices.size();
138 const int nTargets = m_vecTargetIndices.size();
139 const int nTimes =
static_cast<int>(data.cols());
144 MatrixXd E(nEog, nTimes);
145 for (
int i = 0; i < nEog; ++i) {
146 E.row(i) = data.row(m_vecEogIndices[i]);
152 for (
int i = 0; i < nTargets; ++i) {
153 data.row(m_vecTargetIndices[i]) -= m_matBeta.row(i) * E;
void fit(const Eigen::MatrixXd &data, const FIFFLIB::FiffInfo &info, const QStringList &eogChannels=QStringList())
Fit regression coefficients from EOG to all other channels.