ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
sampler.h
Go to the documentation of this file.
1 // ----------------------------------------------------------------------------
2 // - CloudViewer: www.cloudViewer.org -
3 // ----------------------------------------------------------------------------
4 // Copyright (c) 2018-2024 www.cloudViewer.org
5 // SPDX-License-Identifier: MIT
6 // ----------------------------------------------------------------------------
7 
8 #pragma once
9 
10 #include <cstddef>
11 #include <vector>
12 
13 #include "util/logging.h"
14 
15 namespace colmap {
16 
17 // Abstract base class for sampling methods.
18 class Sampler {
19 public:
20  Sampler() {};
21  explicit Sampler(const size_t num_samples);
22 
23  // Initialize the sampler, before calling the `Sample` method.
24  virtual void Initialize(const size_t total_num_samples) = 0;
25 
26  // Maximum number of unique samples that can be generated.
27  virtual size_t MaxNumSamples() = 0;
28 
29  // Sample `num_samples` elements from all samples.
30  virtual std::vector<size_t> Sample() = 0;
31 
32  // Sample elements from `X` into `X_rand`.
33  //
34  // Note that `X.size()` should equal `num_total_samples` and `X_rand.size()`
35  // should equal `num_samples`.
36  template <typename X_t>
37  void SampleX(const X_t& X, X_t* X_rand);
38 
39  // Sample elements from `X` and `Y` into `X_rand` and `Y_rand`.
40  //
41  // Note that `X.size()` should equal `num_total_samples` and `X_rand.size()`
42  // should equal `num_samples`. The same applies for `Y` and `Y_rand`.
43  template <typename X_t, typename Y_t>
44  void SampleXY(const X_t& X, const Y_t& Y, X_t* X_rand, Y_t* Y_rand);
45 };
46 
48 // Implementation
50 
51 template <typename X_t>
52 void Sampler::SampleX(const X_t& X, X_t* X_rand) {
53  const auto sample_idxs = Sample();
54  for (size_t i = 0; i < X_rand->size(); ++i) {
55  (*X_rand)[i] = X[sample_idxs[i]];
56  }
57 }
58 
59 template <typename X_t, typename Y_t>
60 void Sampler::SampleXY(const X_t& X, const Y_t& Y, X_t* X_rand, Y_t* Y_rand) {
61  CHECK_EQ(X.size(), Y.size());
62  CHECK_EQ(X_rand->size(), Y_rand->size());
63  const auto sample_idxs = Sample();
64  for (size_t i = 0; i < X_rand->size(); ++i) {
65  (*X_rand)[i] = X[sample_idxs[i]];
66  (*Y_rand)[i] = Y[sample_idxs[i]];
67  }
68 }
69 
70 } // namespace colmap
void * X
Definition: SmallVector.cpp:45
virtual std::vector< size_t > Sample()=0
virtual size_t MaxNumSamples()=0
void SampleXY(const X_t &X, const Y_t &Y, X_t *X_rand, Y_t *Y_rand)
Definition: sampler.h:60
void SampleX(const X_t &X, X_t *X_rand)
Definition: sampler.h:52
Sampler(const size_t num_samples)
virtual void Initialize(const size_t total_num_samples)=0