54 #include <QSharedPointer>
55 #include <QTextStream>
58 #include <QStringList>
96 typedef QSharedPointer<IOUtils>
SPtr;
115 static qint32 fread3(QDataStream &p_qStream);
127 static qint32 fread3(std::iostream& stream);
140 static Eigen::VectorXi fread3_many(QDataStream &p_qStream, qint32 count);
153 static Eigen::VectorXi fread3_many(std::iostream &stream, qint32 count);
163 static qint16 swap_short (qint16 source);
173 static qint32 swap_int (qint32 source);
181 static void swap_intp (qint32 *source);
191 static qint64 swap_long (qint64 source);
199 static void swap_longp (qint64 *source);
209 static float swap_float (
float source);
217 static void swap_floatp (
float *source);
225 static void swap_doublep(
double *source);
235 static bool write_eigen_matrix(
const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& in,
const QString& sPath,
const QString& sDescription = QString());
237 static bool write_eigen_matrix(
const Eigen::Matrix<T, 1, Eigen::Dynamic>& in,
const QString& sPath,
const QString& sDescription = QString());
239 static bool write_eigen_matrix(
const Eigen::Matrix<T, Eigen::Dynamic, 1>& in,
const QString& sPath,
const QString& sDescription = QString());
249 static bool write_eigen_matrix(
const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& in,
const std::string& sPath,
const std::string& sDescription = std::string());
251 static bool write_eigen_matrix(
const Eigen::Matrix<T, 1, Eigen::Dynamic>& in,
const std::string& sPath,
const std::string& sDescription = std::string());
253 static bool write_eigen_matrix(
const Eigen::Matrix<T, Eigen::Dynamic, 1>& in,
const std::string& sPath,
const std::string& sDescription = std::string());
263 static bool read_eigen_matrix(Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& out,
const QString& path);
265 static bool read_eigen_matrix(Eigen::Matrix<T, 1, Eigen::Dynamic>& out,
const QString& path);
267 static bool read_eigen_matrix(Eigen::Matrix<T, Eigen::Dynamic, 1>& out,
const QString& path);
277 static bool read_eigen_matrix(Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& out,
const std::string& path);
279 static bool read_eigen_matrix(Eigen::Matrix<T, 1, Eigen::Dynamic>& out,
const std::string& path);
281 static bool read_eigen_matrix(Eigen::Matrix<T, Eigen::Dynamic, 1>& out,
const std::string& path);
291 static QStringList get_new_chnames_conventions(
const QStringList& chNames);
301 static std::vector<std::string> get_new_chnames_conventions(
const std::vector<std::string>& chNames);
311 static QStringList get_old_chnames_conventions(
const QStringList& chNames);
321 static std::vector<std::string> get_old_chnames_conventions(
const std::vector<std::string>& chNames);
333 static bool check_matching_chnames_conventions(
const QStringList& chNamesA,
const QStringList& chNamesB,
bool bCheckForNewNamingConvention =
false);
345 static bool check_matching_chnames_conventions(
const std::vector<std::string>& chNamesA,
const std::vector<std::string>& chNamesB,
bool bCheckForNewNamingConvention =
false);
355 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> matrixName(1,in.cols());
356 matrixName.row(0)= in;
365 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> matrixName(in.rows(),1);
366 matrixName.col(0)= in;
376 if(file.open(QIODevice::WriteOnly|QIODevice::Truncate))
378 QTextStream stream(&file);
379 if(!sDescription.isEmpty()) {
380 stream<<
"# Dimensions (rows x cols): "<<in.rows()<<
" x "<<in.cols()<<
"\n";
381 stream<<
"# Description: "<<sDescription<<
"\n";
384 for(
int row = 0; row<in.rows(); row++) {
385 for(
int col = 0; col<in.cols(); col++)
386 stream << in(row, col)<<
" ";
390 qWarning()<<
"Could not write Eigen element to file! Path does not exist!";
402 bool IOUtils::write_eigen_matrix(
const Eigen::Matrix<T, 1, Eigen::Dynamic>& in,
const std::string& sPath,
const std::string& sDescription)
404 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> matrixName(1,in.cols());
405 matrixName.row(0)= in;
412 bool IOUtils::write_eigen_matrix(
const Eigen::Matrix<T, Eigen::Dynamic, 1>& in,
const std::string& sPath,
const std::string& sDescription)
414 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> matrixName(in.rows(),1);
415 matrixName.col(0)= in;
422 bool IOUtils::write_eigen_matrix(
const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& in,
const std::string& sPath,
const std::string& sDescription)
424 std::ofstream outputFile(sPath);
425 if(outputFile.is_open())
427 if(!sDescription.empty()) {
428 outputFile<<
"# Dimensions (rows x cols): "<<in.rows()<<
" x "<<in.cols()<<
"\n";
429 outputFile<<
"# Description: "<<sDescription<<
"\n";
432 for(
int row = 0; row<in.rows(); row++) {
433 for(
int col = 0; col<in.cols(); col++)
434 outputFile << in(row, col)<<
" ";
438 qWarning()<<
"Could not write Eigen element to file! Path does not exist!";
450 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> matrixName;
453 if(matrixName.rows() > 0)
455 out = matrixName.row(0);
466 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> matrixName;
469 if(matrixName.cols() > 0)
471 out = matrixName.col(0);
484 if(file.open(QIODevice::ReadOnly | QIODevice::Text)) {
486 QTextStream in(&file);
487 QList<Eigen::VectorXd> help;
491 QString line = in.readLine();
492 if(!line.contains(
"#")) {
493 QStringList fields = line.split(QRegExp(
"\\s+"));
496 if(fields.at(fields.size()-1) ==
"")
499 Eigen::VectorXd x (fields.size());
501 for (
int j = 0; j<fields.size(); j++) {
502 x(j) = fields.at(j).toDouble();
509 int rows = help.size();
510 int cols = rows <= 0 ? 0 : help.at(0).rows();
512 out.resize(rows, cols);
514 for (
int i=0; i < help.length(); i++) {
515 out.row(i) = help[i].transpose();
518 qWarning()<<
"IOUtils::read_eigen_matrix - Could not read Eigen element from file! Path does not exist!";
530 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> matrixName;
533 if(matrixName.rows() > 0)
535 out = matrixName.row(0);
546 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> matrixName;
549 if(matrixName.cols() > 0)
551 out = matrixName.col(0);
562 std::ifstream inputFile(path);
564 if(inputFile.is_open()) {
566 std::vector<Eigen::VectorXd> help;
570 while(std::getline(inputFile, line)){
571 if(line.find(
'#') == std::string::npos){
572 std::vector<double> elements;
573 std::stringstream stream{line};
577 while(stream >> element){
578 elements.push_back(std::stod(element));
582 Eigen::VectorXd x (elements.size());
584 for(
size_t i = 0; i < elements.size(); ++i){
585 x(i) = elements.at(i);
588 help.push_back(std::move(x));
592 int rows = help.size();
593 int cols = rows <= 0 ? 0 : help.at(0).rows();
595 out.resize(rows, cols);
597 for (
size_t i = 0; i < help.size(); i++) {
598 out.row(i) = help[i].transpose();
601 qWarning()<<
"IOUtils::read_eigen_matrix - Could not read Eigen element from file! Path does not exist!";