yaml/MatrixIO.hpp
Go to the documentation of this file.
1 
2 #ifndef LVR2_IO_YAML_MATRIX_IO_HPP
3 #define LVR2_IO_YAML_MATRIX_IO_HPP
4 
5 #include <Eigen/Dense>
6 #include <yaml-cpp/yaml.h>
7 
8 namespace YAML
9 {
10 
11 
12 template <class Scalar_, int A_, int B_, int C_, int D_, int E_>
13 struct convert<Eigen::Matrix<Scalar_, A_, B_, C_, D_, E_> >
14 {
15 
19  template <class Scalar, int A, int B, int C, int D, int E>
20  static Node encode(const Eigen::Matrix<Scalar, A, B, C, D, E>& M)
21  {
22  typedef typename Eigen::Matrix<Scalar, A, B, C, D, E>::Index IndexType;
23  IndexType rows = M.rows();
24  IndexType cols = M.cols();
25 
26  Node node;
27 
28  node["rows"] = rows;
29  node["cols"] = cols;
30  node["data"] = Load("[]");
31 
32  for (IndexType i = 0; i < rows; ++i) {
33  for (IndexType j = 0; j < cols; ++j) {
34  node["data"].push_back(M.coeff(i, j));
35  }
36  }
37  return node;
38  }
39 
40  template <class Scalar, int A, int B, int C, int D, int E>
41  static bool decode(const Node& node, Eigen::Matrix<Scalar, A, B, C, D, E>& M)
42  {
43  typedef typename Eigen::Matrix<Scalar, A, B, C, D, E>::Index IndexType;
44 
45  IndexType rows = node["rows"].as<IndexType>();
46  IndexType cols = node["cols"].as<IndexType>();
47 
48  size_t expected_size = M.rows() * M.cols();
49  if (!node["data"].IsSequence() || node["data"].size() != expected_size) {
50  return false;
51  }
52 
53  YAML::const_iterator it = node["data"].begin();
54  YAML::const_iterator it_end = node["data"].end();
55  if (rows > 0 && cols > 0) {
56  for (IndexType i = 0; i < rows; ++i) {
57  for (IndexType j = 0; j < cols; ++j) {
58  M.coeffRef(i, j) = it->as<Scalar>();
59  ++it;
60  }
61  }
62  }
63  return true;
64  }
65 
66  template <class Scalar, int B, int C, int D, int E>
67  static bool decode(const Node& node, Eigen::Matrix<Scalar, Eigen::Dynamic, B, C, D, E>& M)
68  {
69 
71  IndexType rows = node["rows"].as<IndexType>();
72  IndexType cols = node["cols"].as<IndexType>();
73 
74  M.resize(rows, Eigen::NoChange);
75 
76  size_t expected_size = M.rows() * M.cols();
77  if (!node["data"].IsSequence() || node["data"].size() != expected_size) {
78  return false;
79  }
80 
81  YAML::const_iterator it = node["data"].begin();
82  YAML::const_iterator it_end = node["data"].end();
83  if (rows > 0 && cols > 0) {
84  for (IndexType i = 0; i < rows; ++i) {
85  for (IndexType j = 0; j < cols; ++j) {
86  M.coeffRef(i, j) = it->as<Scalar>();
87  ++it;
88  }
89  }
90  }
91  return true;
92  }
93 
97  template <class Scalar, int A, int C, int D, int E>
98  static bool decode(const Node& node, Eigen::Matrix<Scalar, A, Eigen::Dynamic, C, D, E>& M)
99  {
101  IndexType rows = node["rows"].as<IndexType>();
102  IndexType cols = node["cols"].as<IndexType>();
103 
104  M.resize(Eigen::NoChange, cols);
105 
106  size_t expected_size = M.rows() * M.cols();
107  if (!node["data"].IsSequence() || node["data"].size() != expected_size) {
108  return false;
109  }
110 
111  YAML::const_iterator it = node["data"].begin();
112  YAML::const_iterator it_end = node["data"].end();
113  if (rows > 0 && cols > 0) {
114  for (IndexType i = 0; i < rows; ++i) {
115  for (IndexType j = 0; j < cols; ++j) {
116  M.coeffRef(i, j) = it->as<Scalar>();
117  ++it;
118  }
119  }
120  }
121  return true;
122  }
123 
127  template <class Scalar, int C, int D, int E>
128  static bool decode(const Node& node, Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic, C, D, E>& M)
129  {
131  IndexType rows = node["rows"].as<IndexType>();
132  IndexType cols = node["cols"].as<IndexType>();
133 
134  M.resize(rows, cols);
135 
136  size_t expected_size = M.rows() * M.cols();
137  if (!node["data"].IsSequence() || node["data"].size() != expected_size) {
138  return false;
139  }
140 
141  YAML::const_iterator it = node["data"].begin();
142  YAML::const_iterator it_end = node["data"].end();
143  if (rows > 0 && cols > 0) {
144  for (IndexType i = 0; i < rows; ++i) {
145  for (IndexType j = 0; j < cols; ++j) {
146  M.coeffRef(i, j) = it->as<Scalar>();
147  ++it;
148  }
149  }
150  }
151  return true;
152  }
153 };
154 } // namespace YAML
155 
156 #endif // LVR2_IO_YAML_MATRIX_IO_HPP
157 
void convert(COORD_SYSTEM from, COORD_SYSTEM to, float *point)
uint32_t Index
Datatype used as index for each vertex, face and edge.
Definition: Handles.hpp:96
static bool decode(const Node &node, Eigen::Matrix< Scalar, A, Eigen::Dynamic, C, D, E > &M)
static bool decode(const Node &node, Eigen::Matrix< Scalar, A, B, C, D, E > &M)
static bool decode(const Node &node, Eigen::Matrix< Scalar, Eigen::Dynamic, B, C, D, E > &M)
static Node encode(const Eigen::Matrix< Scalar, A, B, C, D, E > &M)
static bool decode(const Node &node, Eigen::Matrix< Scalar, Eigen::Dynamic, Eigen::Dynamic, C, D, E > &M)


lvr2
Author(s): Thomas Wiemann , Sebastian Pütz , Alexander Mock , Lars Kiesow , Lukas Kalbertodt , Tristan Igelbrink , Johan M. von Behren , Dominik Feldschnieders , Alexander Löhr
autogenerated on Mon Feb 28 2022 22:46:08