v2.0.0
Loading...
Searching...
No Matches
ioutils.h
Go to the documentation of this file.
1//=============================================================================================================
35
36#ifndef IOUTILS_H
37#define IOUTILS_H
38
39//=============================================================================================================
40// INCLUDES
41//=============================================================================================================
42
43#include "utils_global.h"
44#include <string>
45#include <sstream>
46#include <vector>
47#include <fstream>
48
49//=============================================================================================================
50// QT INCLUDES
51//=============================================================================================================
52
53#include <QSharedPointer>
54#include <QTextStream>
55#include <QFile>
56#include <QDebug>
57#include <QStringList>
58#include <QRegularExpression>
59
60//=============================================================================================================
61// EIGEN INCLUDES
62//=============================================================================================================
63
64#include <Eigen/Core>
65
66//=============================================================================================================
67// DEFINE NAMESPACE UTILSLIB
68//=============================================================================================================
69
70namespace UTILSLIB
71{
72
73//=============================================================================================================
80{
81public:
82 typedef QSharedPointer<IOUtils> SPtr;
83 typedef QSharedPointer<const IOUtils> ConstSPtr;
84
86
87 //=========================================================================================================
91 template<typename T>
92 static bool write_eigen_matrix(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& in, const QString& sPath, const QString& sDescription = QString());
93 template<typename T>
94 static bool write_eigen_matrix(const Eigen::Matrix<T, 1, Eigen::Dynamic>& in, const QString& sPath, const QString& sDescription = QString());
95 template<typename T>
96 static bool write_eigen_matrix(const Eigen::Matrix<T, Eigen::Dynamic, 1>& in, const QString& sPath, const QString& sDescription = QString());
97
98 //=========================================================================================================
102 template<typename T>
103 static bool write_eigen_matrix(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& in, const std::string& sPath, const std::string& sDescription = std::string());
104 template<typename T>
105 static bool write_eigen_matrix(const Eigen::Matrix<T, 1, Eigen::Dynamic>& in, const std::string& sPath, const std::string& sDescription = std::string());
106 template<typename T>
107 static bool write_eigen_matrix(const Eigen::Matrix<T, Eigen::Dynamic, 1>& in, const std::string& sPath, const std::string& sDescription = std::string());
108
109 //=========================================================================================================
113 template<typename T>
114 static bool read_eigen_matrix(Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& out, const QString& path);
115 template<typename T>
116 static bool read_eigen_matrix(Eigen::Matrix<T, 1, Eigen::Dynamic>& out, const QString& path);
117 template<typename T>
118 static bool read_eigen_matrix(Eigen::Matrix<T, Eigen::Dynamic, 1>& out, const QString& path);
119
120 //=========================================================================================================
124 template<typename T>
125 static bool read_eigen_matrix(Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& out, const std::string& path);
126 template<typename T>
127 static bool read_eigen_matrix(Eigen::Matrix<T, 1, Eigen::Dynamic>& out, const std::string& path);
128 template<typename T>
129 static bool read_eigen_matrix(Eigen::Matrix<T, Eigen::Dynamic, 1>& out, const std::string& path);
130};
131
132//=============================================================================================================
133// INLINE DEFINITIONS
134//=============================================================================================================
135
136template<typename T>
137bool IOUtils::write_eigen_matrix(const Eigen::Matrix<T, 1, Eigen::Dynamic>& in, const QString& sPath, const QString& sDescription)
138{
139 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> matrixName(1,in.cols());
140 matrixName.row(0)= in;
141 return IOUtils::write_eigen_matrix(matrixName, sPath, sDescription);
142}
143
144//=============================================================================================================
145
146template<typename T>
147bool IOUtils::write_eigen_matrix(const Eigen::Matrix<T, Eigen::Dynamic, 1>& in, const QString& sPath, const QString& sDescription)
148{
149 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> matrixName(in.rows(),1);
150 matrixName.col(0)= in;
151 return IOUtils::write_eigen_matrix(matrixName, sPath, sDescription);
152}
153
154//=============================================================================================================
155
156template<typename T>
157bool IOUtils::write_eigen_matrix(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& in, const QString& sPath, const QString& sDescription)
158{
159 QFile file(sPath);
160 if(file.open(QIODevice::WriteOnly|QIODevice::Truncate))
161 {
162 QTextStream stream(&file);
163 if(!sDescription.isEmpty()) {
164 stream<<"# Dimensions (rows x cols): "<<in.rows()<<" x "<<in.cols()<<"\n";
165 stream<<"# Description: "<<sDescription<<"\n";
166 }
167
168 for(int row = 0; row<in.rows(); row++) {
169 for(int col = 0; col<in.cols(); col++)
170 stream << in(row, col)<<" ";
171 stream<<"\n";
172 }
173 } else {
174 qWarning()<<"Could not write Eigen element to file! Path does not exist!";
175 return false;
176 }
177
178 file.close();
179
180 return true;
181}
182
183//=============================================================================================================
184
185template<typename T>
186bool IOUtils::write_eigen_matrix(const Eigen::Matrix<T, 1, Eigen::Dynamic>& in, const std::string& sPath, const std::string& sDescription)
187{
188 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> matrixName(1,in.cols());
189 matrixName.row(0)= in;
190 return IOUtils::write_eigen_matrix(matrixName, sPath, sDescription);
191}
192
193//=============================================================================================================
194
195template<typename T>
196bool IOUtils::write_eigen_matrix(const Eigen::Matrix<T, Eigen::Dynamic, 1>& in, const std::string& sPath, const std::string& sDescription)
197{
198 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> matrixName(in.rows(),1);
199 matrixName.col(0)= in;
200 return IOUtils::write_eigen_matrix(matrixName, sPath, sDescription);
201}
202
203//=============================================================================================================
204
205template<typename T>
206bool IOUtils::write_eigen_matrix(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& in, const std::string& sPath, const std::string& sDescription)
207{
208 std::ofstream outputFile(sPath);
209 if(outputFile.is_open())
210 {
211 if(!sDescription.empty()) {
212 outputFile<<"# Dimensions (rows x cols): "<<in.rows()<<" x "<<in.cols()<<"\n";
213 outputFile<<"# Description: "<<sDescription<<"\n";
214 }
215
216 for(int row = 0; row<in.rows(); row++) {
217 for(int col = 0; col<in.cols(); col++)
218 outputFile << in(row, col)<<" ";
219 outputFile<<"\n";
220 }
221 } else {
222 qWarning()<<"Could not write Eigen element to file! Path does not exist!";
223 return false;
224 }
225
226 return true;
227}
228
229//=============================================================================================================
230
231template<typename T>
232bool IOUtils::read_eigen_matrix(Eigen::Matrix<T, 1, Eigen::Dynamic>& out, const QString& path)
233{
234 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> matrixName;
235 bool bStatus = IOUtils::read_eigen_matrix(matrixName, path);
236
237 if(matrixName.rows() > 0)
238 {
239 out = matrixName.row(0);
240 }
241
242 return bStatus;
243}
244
245//=============================================================================================================
246
247template<typename T>
248bool IOUtils::read_eigen_matrix(Eigen::Matrix<T, Eigen::Dynamic, 1>& out, const QString& path)
249{
250 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> matrixName;
251 bool bStatus = IOUtils::read_eigen_matrix(matrixName, path);
252
253 if(matrixName.cols() > 0)
254 {
255 out = matrixName.col(0);
256 }
257
258 return bStatus;
259}
260
261//=============================================================================================================
262
263template<typename T>
264bool IOUtils::read_eigen_matrix(Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& out, const QString& path)
265{
266 QFile file(path);
267
268 if(file.open(QIODevice::ReadOnly | QIODevice::Text)) {
269 //Start reading from file
270 QTextStream in(&file);
271 QList<Eigen::VectorXd> help;
272
273 while(!in.atEnd())
274 {
275 QString line = in.readLine();
276 if(!line.contains("#")) {
277 QStringList fields = line.split(QRegularExpression("\\s+"));
278
279 //Delete last element if it is a blank character
280 if(fields.at(fields.size()-1) == "")
281 fields.removeLast();
282
283 Eigen::VectorXd x (fields.size());
284
285 for (int j = 0; j<fields.size(); j++) {
286 x(j) = fields.at(j).toDouble();
287 }
288
289 help.append(x);
290 }
291 }
292
293 int rows = help.size();
294 int cols = rows <= 0 ? 0 : help.at(0).rows();
295
296 out.resize(rows, cols);
297
298 for (int i=0; i < help.length(); i++) {
299 out.row(i) = help[i].transpose();
300 }
301 } else {
302 qWarning()<<"IOUtils::read_eigen_matrix - Could not read Eigen element from file! Path does not exist!";
303 return false;
304 }
305
306 return true;
307}
308
309//=============================================================================================================
310
311template<typename T>
312bool IOUtils::read_eigen_matrix(Eigen::Matrix<T, 1, Eigen::Dynamic>& out, const std::string& path)
313{
314 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> matrixName;
315 bool bStatus = IOUtils::read_eigen_matrix(matrixName, path);
316
317 if(matrixName.rows() > 0)
318 {
319 out = matrixName.row(0);
320 }
321
322 return bStatus;
323}
324
325//=============================================================================================================
326
327template<typename T>
328bool IOUtils::read_eigen_matrix(Eigen::Matrix<T, Eigen::Dynamic, 1>& out, const std::string& path)
329{
330 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> matrixName;
331 bool bStatus = IOUtils::read_eigen_matrix(matrixName, path);
332
333 if(matrixName.cols() > 0)
334 {
335 out = matrixName.col(0);
336 }
337
338 return bStatus;
339}
340
341//=============================================================================================================
342
343template<typename T>
344bool IOUtils::read_eigen_matrix(Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& out, const std::string& path)
345{
346 std::ifstream inputFile(path);
347
348 if(inputFile.is_open()) {
349 //Start reading from file
350 std::vector<Eigen::VectorXd> help;
351
352 std::string line;
353
354 while(std::getline(inputFile, line)){
355 if(line.find('#') == std::string::npos){
356 std::vector<double> elements;
357 std::stringstream stream{line};
358 std::string element;
359
360 stream >> std::ws;
361 while(stream >> element){
362 elements.push_back(std::stod(element));
363 stream >> std::ws;
364 }
365
366 Eigen::VectorXd x (elements.size());
367
368 for(size_t i = 0; i < elements.size(); ++i){
369 x(i) = elements.at(i);
370 }
371
372 help.push_back(std::move(x));
373 }
374 }
375
376 int rows = help.size();
377 int cols = rows <= 0 ? 0 : help.at(0).rows();
378
379 out.resize(rows, cols);
380
381 for (size_t i = 0; i < help.size(); i++) {
382 out.row(i) = help[i].transpose();
383 }
384 } else {
385 qWarning()<<"IOUtils::read_eigen_matrix - Could not read Eigen element from file! Path does not exist!";
386 return false;
387 }
388
389 return true;
390}
391} // NAMESPACE
392
393#endif // IOUTILS_H
394
utils library export/import macros.
#define UTILSSHARED_EXPORT
Shared utilities (I/O helpers, spectral analysis, layout management, warp algorithms).
Eigen matrix I/O utilities.
Definition ioutils.h:80
static bool write_eigen_matrix(const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > &in, const QString &sPath, const QString &sDescription=QString())
Definition ioutils.h:157
QSharedPointer< IOUtils > SPtr
Definition ioutils.h:82
QSharedPointer< const IOUtils > ConstSPtr
Definition ioutils.h:83
static bool read_eigen_matrix(Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > &out, const QString &path)
Definition ioutils.h:264