81 const QList<FsLabel>& labels,
85 if (stc.
isEmpty() || labels.isEmpty()) {
86 qWarning() <<
"[InvLabelTimeCourse::extract] Empty stc or labels.";
90 const int nTimes =
static_cast<int>(stc.
data.cols());
91 const int nLabels = labels.size();
99 QMap<int, int> vertexToRow;
100 for (
int i = 0; i < stc.
vertices.size(); ++i)
101 vertexToRow.insert(stc.
vertices[i], i);
104 QList<int> outputLabelIndices;
105 for (
int li = 0; li < nLabels; ++li) {
107 for (
int vi = 0; vi < labels[li].vertices.size(); ++vi) {
108 if (vertexToRow.contains(labels[li].vertices[vi]))
111 if (count > 0 || bAllowEmpty)
112 outputLabelIndices.append(li);
115 MatrixXd result = MatrixXd::Zero(outputLabelIndices.size(), nTimes);
117 for (
int oi = 0; oi < outputLabelIndices.size(); ++oi) {
118 const FsLabel& label = labels[outputLabelIndices[oi]];
122 for (
int vi = 0; vi < label.
vertices.size(); ++vi) {
123 auto it = vertexToRow.find(label.
vertices[vi]);
124 if (it != vertexToRow.end())
125 rows.append(it.value());
131 const int nVerts = rows.size();
134 MatrixXd labelData(nVerts, nTimes);
135 for (
int i = 0; i < nVerts; ++i)
136 labelData.row(i) = stc.
data.row(rows[i]);
138 if (mode ==
"mean") {
139 result.row(oi) = labelData.colwise().mean();
141 else if (mode ==
"mean_flip") {
143 MatrixXd flipped = labelData;
144 for (
int i = 0; i < nVerts; ++i)
145 flipped.row(i) *= signs[i];
146 result.row(oi) = flipped.colwise().mean();
148 else if (mode ==
"pca_flip") {
150 RowVectorXd meanTime = labelData.colwise().mean();
151 MatrixXd centered = labelData.rowwise() - meanTime;
153 JacobiSVD<MatrixXd>
svd(centered, ComputeThinV);
155 RowVectorXd pc1 =
svd.matrixV().col(0).transpose();
158 double sv1 =
svd.singularValues()[0];
159 pc1 *= sv1 / std::sqrt(
static_cast<double>(nVerts));
163 double corr = (meanTime.array() * pc1.array()).sum();
167 result.row(oi) = pc1;
169 else if (mode ==
"max") {
171 for (
int t = 0; t < nTimes; ++t) {
173 double maxAbsVal = 0.0;
174 for (
int i = 0; i < nVerts; ++i) {
175 double absVal = std::abs(labelData(i, t));
176 if (absVal > maxAbsVal) {
178 maxVal = labelData(i, t);
181 result(oi, t) = maxVal;
185 qWarning() <<
"[InvLabelTimeCourse::extract] Unknown mode:" << mode
187 result.row(oi) = labelData.colwise().mean();