43 const MatrixXd& matLeadField)
45 if (matInverseKernel.cols() != matLeadField.rows()) {
46 qWarning() <<
"[InvResolutionMatrix::compute] Dimension mismatch:"
47 <<
"inverse kernel cols" << matInverseKernel.cols()
48 <<
"!= lead field rows" << matLeadField.rows();
52 return matInverseKernel * matLeadField;
59 if (iSourceIdx < 0 || iSourceIdx >= matResolution.cols()) {
60 qWarning() <<
"[InvResolutionMatrix::getPsf] Index out of range:" << iSourceIdx;
64 return matResolution.col(iSourceIdx);
71 if (iSourceIdx < 0 || iSourceIdx >= matResolution.rows()) {
72 qWarning() <<
"[InvResolutionMatrix::getCtf] Index out of range:" << iSourceIdx;
76 return matResolution.row(iSourceIdx).transpose();
82 const VectorXi& vecSourceIdx)
84 const int nIdx =
static_cast<int>(vecSourceIdx.size());
85 MatrixXd result(matResolution.rows(), nIdx);
87 for (
int i = 0; i < nIdx; ++i) {
88 if (vecSourceIdx[i] >= 0 && vecSourceIdx[i] < matResolution.cols())
89 result.col(i) = matResolution.col(vecSourceIdx[i]);
91 result.col(i).setZero();
100 const VectorXi& vecSourceIdx)
102 const int nIdx =
static_cast<int>(vecSourceIdx.size());
103 MatrixXd result(nIdx, matResolution.cols());
105 for (
int i = 0; i < nIdx; ++i) {
106 if (vecSourceIdx[i] >= 0 && vecSourceIdx[i] < matResolution.rows())
107 result.row(i) = matResolution.row(vecSourceIdx[i]);
109 result.row(i).setZero();
118 const MatrixX3d& matPositions)
120 const int nSrc =
static_cast<int>(matResolution.rows());
121 VectorXd spread(nSrc);
123 for (
int s = 0; s < nSrc; ++s) {
125 VectorXd psf = matResolution.col(s).cwiseAbs2();
126 double psfSum = psf.sum();
127 if (psfSum < 1e-30) {
136 double meanDist = 0.0;
137 double meanDist2 = 0.0;
138 for (
int j = 0; j < nSrc; ++j) {
139 double dist = (matPositions.row(j) - matPositions.row(s)).norm();
140 meanDist += psf[j] * dist;
141 meanDist2 += psf[j] * dist * dist;
145 spread[s] = std::sqrt(std::max(0.0, meanDist2 - meanDist * meanDist));
154 const MatrixX3d& matPositions)
156 const int nSrc =
static_cast<int>(matResolution.rows());
159 for (
int s = 0; s < nSrc; ++s) {
161 VectorXd psf = matResolution.col(s).cwiseAbs();
163 psf.maxCoeff(&peakIdx);
165 ple[s] = (matPositions.row(peakIdx) - matPositions.row(s)).norm();
Resolution-matrix analysis for linear inverse operators — point-spread and cross-talk functions.
Inverse source estimation (MNE, dSPM, sLORETA, dipole fitting).
static Eigen::MatrixXd compute(const Eigen::MatrixXd &matInverseKernel, const Eigen::MatrixXd &matLeadField)
static Eigen::VectorXd peakLocalisationError(const Eigen::MatrixXd &matResolution, const Eigen::MatrixX3d &matPositions)
static Eigen::MatrixXd getCtfs(const Eigen::MatrixXd &matResolution, const Eigen::VectorXi &vecSourceIdx)
static Eigen::MatrixXd getPsfs(const Eigen::MatrixXd &matResolution, const Eigen::VectorXi &vecSourceIdx)
static Eigen::VectorXd spatialSpread(const Eigen::MatrixXd &matResolution, const Eigen::MatrixX3d &matPositions)
static Eigen::VectorXd getCtf(const Eigen::MatrixXd &matResolution, int iSourceIdx)
static Eigen::VectorXd getPsf(const Eigen::MatrixXd &matResolution, int iSourceIdx)