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();
140 }
else if (mode ==
"mean_flip") {
142 MatrixXd flipped = labelData;
143 for (
int i = 0; i < nVerts; ++i)
144 flipped.row(i) *= signs[i];
145 result.row(oi) = flipped.colwise().mean();
146 }
else if (mode ==
"pca_flip") {
148 RowVectorXd meanTime = labelData.colwise().mean();
149 MatrixXd centered = labelData.rowwise() - meanTime;
151 JacobiSVD<MatrixXd>
svd(centered, ComputeThinV);
153 RowVectorXd pc1 =
svd.matrixV().col(0).transpose();
156 double sv1 =
svd.singularValues()[0];
157 pc1 *= sv1 / std::sqrt(
static_cast<double>(nVerts));
161 double corr = (meanTime.array() * pc1.array()).sum();
165 result.row(oi) = pc1;
166 }
else if (mode ==
"max") {
168 for (
int t = 0; t < nTimes; ++t) {
170 double maxAbsVal = 0.0;
171 for (
int i = 0; i < nVerts; ++i) {
172 double absVal = std::abs(labelData(i, t));
173 if (absVal > maxAbsVal) {
175 maxVal = labelData(i, t);
178 result(oi, t) = maxVal;
181 qWarning() <<
"[InvLabelTimeCourse::extract] Unknown mode:" << mode
183 result.row(oi) = labelData.colwise().mean();