farm-ng-core
complex.h
Go to the documentation of this file.
1 // Copyright (c) 2011, Hauke Strasdat
2 // Copyright (c) 2012, Steven Lovegrove
3 // Copyright (c) 2021, farm-ng, inc.
4 //
5 // Use of this source code is governed by an MIT-style
6 // license that can be found in the LICENSE file or at
7 // https://opensource.org/licenses/MIT.
8 
9 #pragma once
10 #include "sophus/common/common.h"
13 
14 namespace sophus {
15 
16 template <class TScalar>
17 class ComplexImpl {
18  public:
19  using Scalar = TScalar;
20  static int constexpr kNumParams = 2;
21  static bool constexpr kIsCommutative = true;
22 
23  using Params = Eigen::Vector<Scalar, kNumParams>;
24 
25  template <class TCompatibleScalar>
26  using ParamsReturn = Eigen::Vector<
27  typename Eigen::ScalarBinaryOpTraits<Scalar, TCompatibleScalar>::
28  ReturnType,
29  2>;
30 
31  // factories
32  static auto zero() -> Eigen::Vector<Scalar, 2> {
33  return Eigen::Vector<Scalar, 2>::Zero();
34  }
35 
36  static auto one() -> Eigen::Vector<Scalar, 2> {
37  return Eigen::Vector<Scalar, 2>(1.0, 0.0);
38  }
39 
40  static auto areParamsValid(Params const& /*unused*/)
41  -> sophus::Expected<Success> {
42  return sophus::Expected<Success>{};
43  }
44 
45  static auto paramsExamples() -> std::vector<Params> {
46  return pointExamples<Scalar, 2>();
47  }
48 
49  static auto invalidParamsExamples() -> std::vector<Params> {
50  return std::vector<Params>({});
51  }
52 
53  // operations
54 
55  template <class TCompatibleScalar>
56  static auto addition(
57  Eigen::Vector<Scalar, 2> const& lhs_real_imag,
58  Eigen::Vector<TCompatibleScalar, 2> const& rhs_real_imag)
60  return lhs_real_imag + rhs_real_imag;
61  }
62 
63  template <class TCompatibleScalar>
64  static auto multiplication(
65  Eigen::Vector<Scalar, 2> const& lhs_real_imag,
66  Eigen::Vector<TCompatibleScalar, 2> const& rhs_real_imag)
68  // complex multiplication
70  lhs_real_imag.x() * rhs_real_imag.x() -
71  lhs_real_imag.y() * rhs_real_imag.y(),
72  lhs_real_imag.x() * rhs_real_imag.y() +
73  lhs_real_imag.y() * rhs_real_imag.x());
74  }
75 
76  static auto conjugate(Eigen::Vector<Scalar, 2> const& a)
77  -> Eigen::Vector<Scalar, 2> {
78  return Eigen::Vector<Scalar, 2>(a.x(), -a.y());
79  }
80 
81  static auto inverse(Eigen::Vector<Scalar, 2> const& real_imag)
82  -> Eigen::Vector<Scalar, 2> {
83  return conjugate(real_imag) / squaredNorm(real_imag);
84  }
85 
86  static auto norm(Eigen::Vector<Scalar, 2> const& real_imag) -> Scalar {
87  using std::hypot;
88  return hypot(real_imag.x(), real_imag.y());
89  }
90 
91  static auto squaredNorm(Eigen::Vector<Scalar, 2> const& real_imag) -> Scalar {
92  return real_imag.squaredNorm();
93  }
94 };
95 
96 template <class TScalar>
97 class Complex {
98  public:
99  using Scalar = TScalar;
100  using Imag = Scalar;
102  static int constexpr kNumParams = 2;
103 
104  using Params = Eigen::Vector<Scalar, kNumParams>;
105 
106  template <class TCompatibleScalar>
107  using ComplexReturn =
109  ReturnType>;
110 
111  // constructors and factories
112 
113  Complex() : params_(Impl::zero()) {}
114 
115  Complex(Complex const&) = default;
116  auto operator=(Complex const&) -> Complex& = default;
117 
118  static auto zero() -> Complex { return Complex::fromParams(Impl::zero()); }
119 
120  static auto one() -> Complex { return Complex::fromParams(Impl::one()); }
121 
122  static auto fromParams(Params const& params) -> Complex {
123  Complex z(UninitTag{});
124  z.setParams(params);
125  return z;
126  }
127 
128  [[nodiscard]] auto params() const -> Params const& { return params_; }
129 
130  void setParams(Params const& params) { params_ = params; }
131 
132  auto real() -> Scalar& { return params_[0]; }
133  [[nodiscard]] auto real() const -> Scalar const& { return params_[0]; }
134 
135  auto imag() -> Scalar& { return params_[1]; }
136  [[nodiscard]] auto imag() const -> Scalar const& { return params_[1]; }
137 
138  template <class TCompatibleScalar>
139  auto operator+(Complex<TCompatibleScalar> const& other) const
141  return Complex::fromParams(Impl::addition(this->params_, other.params()));
142  }
143 
144  template <class TCompatibleScalar>
145  auto operator*(Complex<TCompatibleScalar> const& other) const
148  Impl::multiplication(this->params_, other.params()));
149  }
150 
151  [[nodiscard]] auto conjugate() const -> Complex {
152  return Complex::fromParams(Impl::conjugate(this->params_));
153  }
154 
155  [[nodiscard]] auto inverse() const -> Complex {
156  return Complex::fromParams(Impl::inverse(this->params_));
157  }
158 
159  [[nodiscard]] auto norm() const -> Scalar {
160  return Impl::norm(this->params_);
161  }
162 
163  [[nodiscard]] auto squaredNorm() const -> Scalar {
164  return Impl::squaredNorm(this->params_);
165  }
166 
167  private:
168  Complex(UninitTag /*unused*/) {}
169  Eigen::Vector2<Scalar> params_;
170 };
171 
172 } // namespace sophus
sophus::Complex::params
auto params() const -> Params const &
Definition: complex.h:128
sophus::ComplexImpl::addition
static auto addition(Eigen::Vector< Scalar, 2 > const &lhs_real_imag, Eigen::Vector< TCompatibleScalar, 2 > const &rhs_real_imag) -> ParamsReturn< TCompatibleScalar >
Definition: complex.h:56
sophus::ComplexImpl::Scalar
TScalar Scalar
Definition: complex.h:19
sophus::Complex::norm
auto norm() const -> Scalar
Definition: complex.h:159
sophus::ComplexImpl::ParamsReturn
Eigen::Vector< typename Eigen::ScalarBinaryOpTraits< Scalar, TCompatibleScalar >::ReturnType, 2 > ParamsReturn
Definition: complex.h:29
sophus::ComplexImpl::norm
static auto norm(Eigen::Vector< Scalar, 2 > const &real_imag) -> Scalar
Definition: complex.h:86
sophus::ComplexImpl::squaredNorm
static auto squaredNorm(Eigen::Vector< Scalar, 2 > const &real_imag) -> Scalar
Definition: complex.h:91
sophus
Image MutImage, owning images types.
Definition: num_diff.h:20
sophus::Complex::imag
auto imag() const -> Scalar const &
Definition: complex.h:136
sophus::Complex::Scalar
TScalar Scalar
Definition: complex.h:99
sophus::Complex::setParams
void setParams(Params const &params)
Definition: complex.h:130
sophus::Complex::squaredNorm
auto squaredNorm() const -> Scalar
Definition: complex.h:163
sophus::ComplexImpl::kIsCommutative
static constexpr bool kIsCommutative
Definition: complex.h:21
sophus::ComplexImpl
Definition: complex.h:17
sophus::Complex::zero
static auto zero() -> Complex
Definition: complex.h:118
sophus::ComplexImpl::invalidParamsExamples
static auto invalidParamsExamples() -> std::vector< Params >
Definition: complex.h:49
sophus::Complex::Complex
Complex()
Definition: complex.h:113
sophus::ComplexImpl::kNumParams
static constexpr int kNumParams
Definition: complex.h:20
sophus::Complex::kNumParams
static constexpr int kNumParams
Definition: complex.h:102
sophus::Complex::real
auto real() const -> Scalar const &
Definition: complex.h:133
sophus::ComplexImpl::zero
static auto zero() -> Eigen::Vector< Scalar, 2 >
Definition: complex.h:32
sophus::Complex::inverse
auto inverse() const -> Complex
Definition: complex.h:155
sophus::ComplexImpl::Params
Eigen::Vector< Scalar, kNumParams > Params
Definition: complex.h:23
sophus::Complex::fromParams
static auto fromParams(Params const &params) -> Complex
Definition: complex.h:122
sophus::Complex::operator+
auto operator+(Complex< TCompatibleScalar > const &other) const -> ComplexReturn< TCompatibleScalar >
Definition: complex.h:139
sophus::Complex::Params
Eigen::Vector< Scalar, kNumParams > Params
Definition: complex.h:104
sophus::Complex::real
auto real() -> Scalar &
Definition: complex.h:132
sophus::Complex::one
static auto one() -> Complex
Definition: complex.h:120
common.h
sophus::ComplexImpl::inverse
static auto inverse(Eigen::Vector< Scalar, 2 > const &real_imag) -> Eigen::Vector< Scalar, 2 >
Definition: complex.h:81
sophus::Complex::imag
auto imag() -> Scalar &
Definition: complex.h:135
sophus::Complex::conjugate
auto conjugate() const -> Complex
Definition: complex.h:151
sophus::Complex::operator=
auto operator=(Complex const &) -> Complex &=default
sophus::ComplexImpl::multiplication
static auto multiplication(Eigen::Vector< Scalar, 2 > const &lhs_real_imag, Eigen::Vector< TCompatibleScalar, 2 > const &rhs_real_imag) -> ParamsReturn< TCompatibleScalar >
Definition: complex.h:64
sophus::ComplexImpl::one
static auto one() -> Eigen::Vector< Scalar, 2 >
Definition: complex.h:36
sophus::Complex::operator*
auto operator*(Complex< TCompatibleScalar > const &other) const -> ComplexReturn< TCompatibleScalar >
Definition: complex.h:145
sophus::ComplexImpl::paramsExamples
static auto paramsExamples() -> std::vector< Params >
Definition: complex.h:45
sophus::Complex::Imag
Scalar Imag
Definition: complex.h:100
division_ring.h
sophus::Complex
Definition: group_accessors.h:15
sophus::ComplexImpl::areParamsValid
static auto areParamsValid(Params const &) -> sophus::Expected< Success >
Definition: complex.h:40
vector_space.h
sophus::UninitTag
Definition: common.h:70
sophus::ComplexImpl::conjugate
static auto conjugate(Eigen::Vector< Scalar, 2 > const &a) -> Eigen::Vector< Scalar, 2 >
Definition: complex.h:76