49 std::vector<Triplet<int>> triplets;
50 triplets.reserve(2 *
static_cast<std::size_t
>(std::max(n - 1, 0)));
51 for (
int i = 0; i + 1 < n; ++i) {
52 triplets.emplace_back(i, i + 1, 1);
53 triplets.emplace_back(i + 1, i, 1);
55 SparseMatrix<int> adjacency(std::max(n, 0), std::max(n, 0));
56 adjacency.setFromTriplets(triplets.begin(), triplets.end());
66 for (
const SparseMatrix<int>& dim : dims)
68 std::vector<Triplet<int>> triplets;
69 triplets.reserve(
static_cast<std::size_t
>(total));
70 for (Index k = 0; k < total; ++k)
71 triplets.emplace_back(
static_cast<int>(k),
static_cast<int>(k), 1);
75 for (
const SparseMatrix<int>& dim : dims) {
76 const Index n = dim.rows();
78 const Index outer = total / (n * stride);
79 for (
int c = 0; c < dim.outerSize(); ++c) {
80 for (SparseMatrix<int>::InnerIterator it(dim, c); it; ++it) {
81 if (it.row() == it.col() || it.value() == 0)
83 for (Index o = 0; o < outer; ++o) {
84 for (Index s = 0; s < stride; ++s) {
85 const Index base = o * n * stride + s;
86 triplets.emplace_back(
static_cast<int>(base + it.row() * stride),
static_cast<int>(base + it.col() * stride), 1);
92 SparseMatrix<int> combined(total, total);
93 combined.setFromTriplets(triplets.begin(), triplets.end(), [](
int a,
int) { return a; });
104 std::vector<int> chIdx;
105 if (picks.isEmpty()) {
106 for (
int i = 0; i < info.
chs.size(); ++i) {
110 for (
int i = 0; i < info.
chs.size(); ++i) {
111 if (picks.contains(info.
chs[i].ch_name)) {
117 const int nCh =
static_cast<int>(chIdx.size());
119 return SparseMatrix<int>(0, 0);
123 MatrixXd pos(nCh, 3);
124 for (
int i = 0; i < nCh; ++i) {
125 const Vector3f& r0 = info.
chs[chIdx[i]].chpos.r0;
126 pos(i, 0) =
static_cast<double>(r0(0));
127 pos(i, 1) =
static_cast<double>(r0(1));
128 pos(i, 2) =
static_cast<double>(r0(2));
132 std::vector<double> nnDist(nCh, std::numeric_limits<double>::max());
133 MatrixXd distMat(nCh, nCh);
134 for (
int i = 0; i < nCh; ++i) {
136 for (
int j = i + 1; j < nCh; ++j) {
137 double d = (pos.row(i) - pos.row(j)).norm();
148 std::vector<double> sortedNN = nnDist;
149 std::sort(sortedNN.begin(), sortedNN.end());
152 medianNN = (sortedNN[nCh / 2 - 1] + sortedNN[nCh / 2]) / 2.0;
154 medianNN = sortedNN[nCh / 2];
157 double threshold = 3.0 * medianNN;
160 std::vector<Triplet<int>> triplets;
161 for (
int i = 0; i < nCh; ++i) {
162 for (
int j = i + 1; j < nCh; ++j) {
163 if (distMat(i, j) <= threshold) {
164 triplets.emplace_back(i, j, 1);
165 triplets.emplace_back(j, i, 1);
170 SparseMatrix<int> adj(nCh, nCh);
171 adj.setFromTriplets(triplets.begin(), triplets.end());
179 std::vector<Triplet<int>> triplets;
181 for (
int t = 0; t < tris.rows(); ++t) {
187 triplets.emplace_back(v0, v1, 1);
188 triplets.emplace_back(v1, v0, 1);
189 triplets.emplace_back(v0, v2, 1);
190 triplets.emplace_back(v2, v0, 1);
191 triplets.emplace_back(v1, v2, 1);
192 triplets.emplace_back(v2, v1, 1);
195 SparseMatrix<int> adj(nVertices, nVertices);
196 adj.setFromTriplets(triplets.begin(), triplets.end());
203 const MatrixX3i& tris,
int nVertices,
int nTimes)
208 const int nTotal = nVertices * nTimes;
209 std::vector<Triplet<int>> triplets;
212 triplets.reserve(
static_cast<size_t>(spatialAdj.nonZeros()) * nTimes +
static_cast<size_t>(nVertices) * (nTimes - 1) * 2);
216 for (
int t = 0; t < nTimes; ++t) {
217 for (
int k = 0; k < spatialAdj.outerSize(); ++k) {
218 for (SparseMatrix<int>::InnerIterator it(spatialAdj, k); it; ++it) {
219 int row =
static_cast<int>(it.row()) * nTimes + t;
220 int col =
static_cast<int>(it.col()) * nTimes + t;
221 triplets.emplace_back(row, col, 1);
227 for (
int v = 0; v < nVertices; ++v) {
228 for (
int t = 0; t < nTimes - 1; ++t) {
229 int idx0 = v * nTimes + t;
230 int idx1 = v * nTimes + t + 1;
231 triplets.emplace_back(idx0, idx1, 1);
232 triplets.emplace_back(idx1, idx0, 1);
236 SparseMatrix<int> adj(nTotal, nTotal);
237 adj.setFromTriplets(triplets.begin(), triplets.end());