C++读入"N,X,Y,Z"格式文本文件到Eigen3 Matrix,以及相同格式输出方法
很多数据资料的格式类似这样:
1,-2085738.7757,5503702.8697,2892977.6829
2,-2071267.5135,5520926.7235,2883341.8135
3,-2079412.5535,5512450.8800,2879771.2119
4,-2093693.1744,5511218.2651,2869861.8947
5,-2113681.5062,5491864.0382,2896934.4852
6,-2100573.2849,5496675.0138,2894377.6030
其中数据按照N(点号),X,Y,Z(三维坐标)排序。
这里提供一种C++读入"N,X,Y,Z"格式文本文件到Eigen3 Matrix的方法,以及对应的同格式输出方法
#pragma once #include <fstream> #include <iostream> #include <string> #include <Eigen/Dense> #include <vector> #include <cmath> #include <iomanip> using namespace std; using namespace Eigen; // 字符串分割 void SplitString(const std::string& s, std::vector<std::string>& v, const std::string& c) { std::string::size_type pos1, pos2; pos2 = s.find(c); pos1 = 0; while (std::string::npos != pos2) { v.push_back(s.substr(pos1, pos2 - pos1)); pos1 = pos2 + c.size(); pos2 = s.find(c, pos1); } if (pos1 != s.length()) v.push_back(s.substr(pos1)); } // 读入相应格式的xyz文件 void ReadXYZFile(string filepath, MatrixXd& origin_data) { ifstream infile; infile.open(filepath); cout << "Reading XYZ File: " << filepath << endl; if (!infile.is_open()) { cout << "File Cannot Open" << endl; exit(1); } int r = 0; // 逐行加载数据 char buffer[100]; while (!infile.eof()) { // getline只能读成char*, // 而SplitString只能切割string, // 而atof又只能转化char*到double infile.getline(buffer, 100); // cout << buffer << endl; string line = buffer; if (line == "") { continue; } vector<string> vector_data; SplitString(line, vector_data, ","); for (int c = 0; c < origin_data.cols(); c++) { origin_data(r, c) = atof(vector_data[c].c_str()); } r++; } return; } // 将矩阵按读入的相同格式保存至相应路径 void WriteXYZFile(string filepath, MatrixXd& trans_data) { ofstream outfile; outfile.open(filepath, ios::out | ios::trunc); for (int r = 0; r < trans_data.rows(); r++) { for (int c = 0; c < trans_data.cols(); c++) { if (c < trans_data.cols() - 1) { outfile << trans_data(r, c) << ','; } if (c == trans_data.cols() - 1) { outfile << trans_data(r, c); } } outfile << endl; } cout << "Write XYZ File: " << filepath << endl; outfile.close(); return; }
总结
到此这篇关于C++读入"N,X,Y,Z"格式文本文件到Eigen3 Matrix的文章就介绍到这了,更多相关c++ 读入文本文件Eigen3 Matrix内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!
问题内容: 我在PHP文档中看到的最接近的是fread()给定的长度,但这没有指定从哪一行开始。还有其他建议吗? 问题答案: 您将无法从X行开始读取,因为行可以是任意长度。因此,您必须从头开始阅读,以计数要读取的行数才能到达X行。例如:
open3d读取bin文件x,y,z,r,g,b,intensity转为pcd发现只能存储x,y,z,rgb无法同时存储颜色跟强度信息,如何处理? 在open3d中发现只有points,colors两个字段可以存储,请问如何同时存储颜色跟强度信息,如何自定义添加字段?
问题内容: 我将如何在SELECT查询中反转此路径: 为了 其中/是定界符,并且在一行中可以有许多定界符 问题答案: 最简单的方法可能是编写一个存储的pl / sql函数,但是可以单独使用SQL(Oracle)来完成。 这将分解子路径中的路径: 然后,我们使用来重构反向路径:
这部分是学术性的,就我的目的而言,我只需要四舍五入到小数点后两位;但我很想知道发生了什么会产生两种略有不同的结果。 这是我编写的测试,将其缩小到最简单的实现: 但它失败了,输出如下: 有谁能详细解释一下是什么原因导致 我在一个答案中寻找的一些要点是:精度损失在哪里?哪种方法是首选的,为什么?哪一个实际上是正确的?(在纯数学中,不可能两者都是对的。也许两者都是错的?)对于这些算术运算,有没有更好的解
如果可以简化此场景,我想让我的病情更易于阅读和漫游: 这将摆脱大量的括号和变量重复,以及“听起来”合乎逻辑(至少对我来说):如果这个var x是这样或那样,那么我就这样做。 特别是当x是一些长对象引用时,例如: 或者,您如何处理逻辑上“简单”但繁琐的编写条件?
我有一个java代码,我在其中读取了一个txt文件,然后迭代它,以便我可以将其填充到2d数组中。在我读取文件后,我能够打印出其内容,因此我确信该文件已被读取。并且我还确信bufferedreader库的. hasNextLine方法在找到一行时显示为true。但是当我在time循环中使用它时,它就像没有找到任何行一样,因此它没有迭代,因为我不知道我在表中有多少行。== 此外,当我硬编码行数以便检查