Loading...
Searching...
No Matches
MatrixDenseBase-Impl.hpp
Go to the documentation of this file.
1// This code is based on Jet framework.
2// Copyright (c) 2018 Doyub Kim
3// CubbyFlow is voxel-based fluid simulation engine for computer games.
4// Copyright (c) 2020 CubbyFlow Team
5// Core Part: Chris Ohk, Junwoo Hwang, Jihong Sin, Seungwoo Yoo
6// AI Part: Dongheon Cho, Minseo Kim
7// We are making my contributions/submissions to this project solely in our
8// personal capacity and are not conveying any rights to any intellectual
9// property of any third parties.
10
11#ifndef CUBBYFLOW_MATRIX_DENSE_BASE_IMPL_HPP
12#define CUBBYFLOW_MATRIX_DENSE_BASE_IMPL_HPP
13
14#include <algorithm>
15#include <cassert>
16
17namespace CubbyFlow
18{
19template <typename T, size_t Rows, size_t Cols, typename D>
20template <size_t R, size_t C, typename E>
23{
24 for (size_t i = 0; i < GetRows(); ++i)
25 {
26 for (size_t j = 0; j < GetCols(); ++j)
27 {
28 (*this)(i, j) = expression.Eval(i, j);
29 }
30 }
31}
33template <typename T, size_t Rows, size_t Cols, typename D>
36 const size_t n = std::min(GetRows(), GetCols());
37
38 for (size_t i = 0; i < n; ++i)
39 {
40 (*this)(i, i) = val;
41 }
42}
44template <typename T, size_t Rows, size_t Cols, typename D>
46{
47 for (size_t i = 0; i < GetRows(); ++i)
48 {
49 for (size_t j = 0; j < GetCols(); ++j)
50 {
51 if (i != j)
52 {
53 (*this)(i, j) = val;
54 }
55 }
56 }
57}
58
59template <typename T, size_t Rows, size_t Cols, typename D>
60template <size_t R, size_t C, typename E>
62 size_t i, const MatrixExpression<T, R, C, E>& row)
64 assert(row.GetRows() == GetCols() && row.GetCols() == 1);
65
66 for (size_t j = 0; j < GetCols(); ++j)
67 {
68 (*this)(i, j) = row.Eval(j, 0);
69 }
70}
71
72template <typename T, size_t Rows, size_t Cols, typename D>
73template <size_t R, size_t C, typename E>
75 size_t j, const MatrixExpression<T, R, C, E>& col)
76{
77 assert(col.GetRows() == GetRows() && col.GetCols() == 1);
78
79 for (size_t i = 0; i < GetRows(); ++i)
80 {
81 (*this)(i, j) = col.Eval(i, 0);
82 }
84
85template <typename T, size_t Rows, size_t Cols, typename D>
88 GetDerived() /= GetDerived().Norm();
89}
90
91template <typename T, size_t Rows, size_t Cols, typename D>
94 D tmp = GetDerived().Transposed();
95
97}
99template <typename T, size_t Rows, size_t Cols, typename D>
101{
102 CopyFrom(GetDerived().Inverse());
103}
104
105template <typename T, size_t Rows, size_t Cols, typename D>
108{
109 assert(i < GetRows() && j < GetCols());
110
111 return GetDerived()[j + i * GetCols()];
113
114template <typename T, size_t Rows, size_t Cols, typename D>
117{
118 assert(i < GetRows() && j < GetCols());
119
120 return GetDerived()[j + i * GetCols()];
121}
122
123template <typename T, size_t Rows, size_t Cols, typename D>
124template <size_t R, size_t C, typename E>
132
133template <typename T, size_t Rows, size_t Cols, typename Derived>
134template <typename D>
135std::enable_if_t<IsMatrixSizeStatic<Rows, Cols>(), D>
140
141template <typename T, size_t Rows, size_t Cols, typename Derived>
142template <typename D>
143std::enable_if_t<IsMatrixSizeDynamic<Rows, Cols>(), D>
148
149template <typename T, size_t Rows, size_t Cols, typename Derived>
150template <typename D>
151std::enable_if_t<IsMatrixSizeStatic<Rows, Cols>(), D>
156
157template <typename T, size_t Rows, size_t Cols, typename Derived>
158template <typename D>
159std::enable_if_t<IsMatrixSizeDynamic<Rows, Cols>(), D>
165
166template <typename T, size_t Rows, size_t Cols, typename Derived>
167template <typename D>
168std::enable_if_t<IsMatrixStaticSquare<Rows, Cols>(), D>
176
177template <typename T, size_t Rows, size_t Cols, typename Derived>
178template <typename D>
179std::enable_if_t<IsMatrixSizeDynamic<Rows, Cols>(), D>
187
188template <typename T, size_t Rows, size_t Cols, typename Derived>
189template <typename... Args, typename D>
190std::enable_if_t<IsMatrixStaticSquare<Rows, Cols>(), D>
192 Args... rest)
193{
194 static_assert(sizeof...(rest) == Rows - 1,
195 "Number of parameters should match the size of diagonal.");
196
197 D m{};
198 std::array<T, Rows> diag{ { first, rest... } };
199
200 for (size_t i = 0; i < Rows; ++i)
201 {
202 m(i, i) = diag[i];
203 }
204
205 return m;
206}
207
208template <typename T, size_t Rows, size_t Cols, typename Derived>
209template <size_t R, size_t C, typename E, typename D>
210std::enable_if_t<IsMatrixStaticSquare<Rows, Cols>(), D>
213{
214 assert(expression.GetCols() == 1);
215
216 D m{};
217
218 for (size_t i = 0; i < Rows; ++i)
219 {
220 m(i, i) = expression.Eval(i, 0);
221 }
222
223 return m;
224}
225
226template <typename T, size_t Rows, size_t Cols, typename Derived>
227template <typename D>
228std::enable_if_t<IsMatrixStaticSquare<Rows, Cols>() && (Rows == 2), D>
230{
231 return D{ std::cos(rad), -std::sin(rad), std::sin(rad), std::cos(rad) };
232}
233
234template <typename T, size_t Rows, size_t Cols, typename Derived>
235template <size_t R, size_t C, typename E, typename D>
236std::enable_if_t<IsMatrixStaticSquare<Rows, Cols>() && (Rows == 3 || Rows == 4),
237 D>
240{
241 assert(axis.GetRows() == 3 && axis.GetCols() == 1);
242
243 D result = MakeIdentity();
244
245 result(0, 0) =
246 1 + (1 - std::cos(rad)) * (axis.Eval(0, 0) * axis.Eval(0, 0) - 1);
247 result(0, 1) = -axis.Eval(2, 0) * std::sin(rad) +
248 (1 - std::cos(rad)) * axis.Eval(0, 0) * axis.Eval(1, 0);
249 result(0, 2) = axis.Eval(1, 0) * std::sin(rad) +
250 (1 - std::cos(rad)) * axis.Eval(0, 0) * axis.Eval(2, 0);
251
252 result(1, 0) = axis.Eval(2, 0) * std::sin(rad) +
253 (1 - std::cos(rad)) * axis.Eval(0, 0) * axis.Eval(1, 0);
254 result(1, 1) =
255 1 + (1 - std::cos(rad)) * (axis.Eval(1, 0) * axis.Eval(1, 0) - 1);
256 result(1, 2) = -axis.Eval(0, 0) * std::sin(rad) +
257 (1 - std::cos(rad)) * axis.Eval(1, 0) * axis.Eval(2, 0);
258
259 result(2, 0) = -axis.Eval(1, 0) * std::sin(rad) +
260 (1 - std::cos(rad)) * axis.Eval(0, 0) * axis.Eval(2, 0);
261 result(2, 1) = axis.Eval(0, 0) * std::sin(rad) +
262 (1 - std::cos(rad)) * axis.Eval(1, 0) * axis.Eval(2, 0);
263 result(2, 2) =
264 1 + (1 - std::cos(rad)) * (axis.Eval(2, 0) * axis.Eval(2, 0) - 1);
265
266 return result;
267}
268
269template <typename T, size_t Rows, size_t Cols, typename Derived>
270template <size_t R, size_t C, typename E, typename D>
271std::enable_if_t<IsMatrixStaticSquare<Rows, Cols>() && (Rows == 4), D>
274{
275 assert(t.GetRows() == 3 && t.GetCols() == 1);
276
277 D result = MakeIdentity();
278
279 result(0, 3) = t.Eval(0, 0);
280 result(1, 3) = t.Eval(1, 0);
281 result(2, 3) = t.Eval(2, 0);
282
283 return result;
284}
285
286template <typename T, size_t Rows, size_t Cols, typename D>
287constexpr size_t MatrixDenseBase<T, Rows, Cols, D>::GetRows() const
288{
289 return static_cast<const D&>(*this).GetRows();
290}
291
292template <typename T, size_t Rows, size_t Cols, typename D>
293constexpr size_t MatrixDenseBase<T, Rows, Cols, D>::GetCols() const
294{
295 return static_cast<const D&>(*this).GetCols();
296}
297
298template <typename T, size_t Rows, size_t Cols, typename D>
299auto MatrixDenseBase<T, Rows, Cols, D>::begin()
300{
301 return GetDerived().begin();
302}
303
304template <typename T, size_t Rows, size_t Cols, typename D>
305constexpr auto MatrixDenseBase<T, Rows, Cols, D>::begin() const
306{
307 return GetDerived().begin();
308}
309
310template <typename T, size_t Rows, size_t Cols, typename D>
311auto MatrixDenseBase<T, Rows, Cols, D>::end()
312{
313 return GetDerived().end();
314}
315
316template <typename T, size_t Rows, size_t Cols, typename D>
317constexpr auto MatrixDenseBase<T, Rows, Cols, D>::end() const
318{
319 return GetDerived().end();
320}
321
322template <typename T, size_t Rows, size_t Cols, typename D>
324MatrixDenseBase<T, Rows, Cols, D>::operator[](size_t i)
325{
326 assert(i < GetRows() * GetCols());
327
328 return GetDerived()[i];
329}
330
331template <typename T, size_t Rows, size_t Cols, typename D>
333MatrixDenseBase<T, Rows, Cols, D>::operator[](size_t i) const
334{
335 assert(i < GetRows() * GetCols());
336
337 return GetDerived()[i];
338}
339
340template <typename T, size_t Rows, size_t Cols, typename D>
341D& MatrixDenseBase<T, Rows, Cols, D>::GetDerived()
342{
343 return static_cast<D&>(*this);
344}
345
346template <typename T, size_t Rows, size_t Cols, typename D>
347const D& MatrixDenseBase<T, Rows, Cols, D>::GetDerived() const
348{
349 return static_cast<const D&>(*this);
350}
351} // namespace CubbyFlow
352
353#endif
Definition MatrixDenseBase.hpp:21
void Transpose()
Transposes this matrix.
Definition MatrixDenseBase-Impl.hpp:92
void Normalize()
Definition MatrixDenseBase-Impl.hpp:86
void SetOffDiagonal(ConstReference val)
Sets off-diagonal elements with input scalar.
Definition MatrixDenseBase-Impl.hpp:45
Reference operator()(size_t i, size_t j)
Definition MatrixDenseBase-Impl.hpp:107
T ValueType
Definition MatrixDenseBase.hpp:23
static std::enable_if_t< IsMatrixSizeStatic< Rows, Cols >(), D > MakeZero()
Makes a static matrix with zero entries.
Definition MatrixDenseBase-Impl.hpp:136
MatrixDenseBase & operator=(const MatrixExpression< T, R, C, E > &expression)
Copies from generic expression.
void SetColumn(size_t j, const MatrixExpression< T, R, C, E > &col)
Sets j-th column with input vector.
Definition MatrixDenseBase-Impl.hpp:74
const T & ConstReference
Definition MatrixDenseBase.hpp:25
static std::enable_if_t< IsMatrixStaticSquare< Rows, Cols >(), D > MakeIdentity()
Makes a static identity matrix.
Definition MatrixDenseBase-Impl.hpp:169
void CopyFrom(const MatrixExpression< T, R, C, E > &expression)
Copies from generic expression.
Definition MatrixDenseBase-Impl.hpp:21
static std::enable_if_t< IsMatrixSizeStatic< Rows, Cols >(), D > MakeConstant(ValueType val)
Makes a static matrix with constant entries.
Definition MatrixDenseBase-Impl.hpp:152
void Invert()
Inverts this matrix.
Definition MatrixDenseBase-Impl.hpp:100
T & Reference
Definition MatrixDenseBase.hpp:24
void SetRow(size_t i, const MatrixExpression< T, R, C, E > &row)
Sets i-th row with input column vector.
Definition MatrixDenseBase-Impl.hpp:61
static std::enable_if_t< IsMatrixStaticSquare< Rows, Cols >(), D > MakeScaleMatrix(ValueType first, Args... rest)
Makes scale matrix.
Definition MatrixDenseBase-Impl.hpp:191
void SetDiagonal(ConstReference val)
Sets diagonal elements with input scalar.
Definition MatrixDenseBase-Impl.hpp:34
Matrix< T, Rows, Cols > Inverse() const
Returns inverse matrix.
Definition MatrixExpression-Impl.hpp:371
MatrixTranspose< T, Rows, Cols, const Derived & > Transposed() const
Definition MatrixExpression-Impl.hpp:365
T Eval(size_t i, size_t j) const
Returns the evaluated value for (i, j).
Definition MatrixExpression-Impl.hpp:33
ValueType Norm() const
Definition MatrixExpression-Impl.hpp:250
Matrix< T, Rows, Cols > & GetDerived()
Returns actual implementation (the subclass).
Definition MatrixExpression-Impl.hpp:509
Definition Matrix.hpp:30
constexpr size_t GetCols() const
Definition Matrix-Impl.hpp:266
Iterator begin()
Definition Matrix-Impl.hpp:272
constexpr size_t GetRows() const
Definition Matrix-Impl.hpp:260
Iterator end()
Definition Matrix-Impl.hpp:285
Definition pybind11Utils.hpp:21
Matrix< T, Rows, 1 > Vector
Definition Matrix.hpp:738