C++读入"N,X,Y,Z"格式文本文件到Eigen3 Matrix

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内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++从文本文件读取数据到vector中的方法

    前言 大家应该都只奥vector(向量)是 C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的.这篇文章介绍的是C++从文本文件读取数据到vector中的方法,下面话不多说,直接来看示例代码吧. 如题,要将如下文本文件读进vector中 示例代码如下 #include <iostream> using namespace std; #include <cmath> #include

  • C/C++读写文本文件、二进制文件的方法

    一:目的 掌握C语言文本文件读写方式: 掌握C语言二进制文件读写方式: 掌握CPP文本文件读写方式: 掌握CPP二进制文件读写方式: 二:C语言文本文件读写 1. 文本文件写入 //采用C模式对Txt进行写出 void TxtWrite_Cmode() { //准备数据 int index[50] ; double x_pos[50], y_pos[50]; for(int i = 0; i < 50; i ++ ) { index[i] = i; x_pos[i] = rand()%1000

  • C++中简单读写文本文件的实现方法

    代码如下所示: 复制代码 代码如下: #include "stdafx.h"#include <iostream>#include <fstream>using namespace std;int _tmain(int argc, _TCHAR* argv[]){ //写入文件 ofstream ofs;  //提供写文件的功能 ofs.open("d:\\com.txt",ios::trunc); //trunc打开文件时,清空已存在的文件

  • C++读入"N,X,Y,Z"格式文本文件到Eigen3 Matrix

    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,

  • Java输入三个整数并把他们由小到大输出(x,y,z)

    题目:输入三个整数x,y,z,请把这三个数由小到大输出. 程序分析:我们想办法把最小的数放到x上,先将x与y进行比较,如果x> y则将x与y的值进行交换,然后再用x与z进行比较,如果x> z则将x与z的值进行交换,这样能使x最小. 程序设计: import java.util.*; public class test { public static void main (String[]args){ int i=0; int j=0; int k=0; int x=0; System.out.

  • sqlplus登录\连接命令、sqlplus命令的使用大全

    我们通常所说的DML.DDL.DCL语句都是sql*plus语句,它们执行完后,都可以保存在一个被称为sql buffer的内存区域中,并且只能保存一条最近执行的sql语句,我们可以对保存在sql buffer中的sql 语句进行修改,然后再次执行,sqlplus一般都与数据库打交道. 常用: sqlplus username/password  如:普通用户登录  sqlplus scott/tiger sqlplus username/password@net_service_name 如:

  • SpringBoot实现API接口的完整代码

    一.简介 产品迭代过程中,同一个接口可能同时存在多个版本,不同版本的接口URL.参数相同,可能就是内部逻辑不同.尤其是在同一接口需要同时支持旧版本和新版本的情况下,比如APP发布新版本了,有的用户可能不选择升级,这是后接口的版本管理就十分必要了,根据APP的版本就可以提供不同版本的接口. 二.代码实现 本文的代码实现基于SpringBoot 2.3.4-release 1.定义注解 ApiVersion @Target({ElementType.TYPE, ElementType.METHOD}

  • SpringBoot实现API接口多版本支持的示例代码

    一.简介 产品迭代过程中,同一个接口可能同时存在多个版本,不同版本的接口URL.参数相同,可能就是内部逻辑不同.尤其是在同一接口需要同时支持旧版本和新版本的情况下,比如APP发布新版本了,有的用户可能不选择升级,这是后接口的版本管理就十分必要了,根据APP的版本就可以提供不同版本的接口. 二.代码实现 本文的代码实现基于SpringBoot 2.3.4-release 1.定义注解 ApiVersion @Target({ElementType.TYPE, ElementType.METHOD}

  • Oracle Sqlplus命令登录多种方式案例讲解

    目录 Oracle Sqlplus命令登录的几种方式 1. sqlplus / as sysdba 2. sqlplus "/as sysdba" 3. sqlplus username/pwd@host/service_name 4. sqlplus /nolog Oracle Sqlplus命令登录的几种方式 sqlplus 命令语法 sqlplus [ [<option>] [{logon | /nolog}] [<start>] ] <option

  • Android开发之自定义view实现通讯录列表A~Z字母提示效果【附demo源码下载】

    本文实例讲述了Android开发之自定义view实现通讯录列表A~Z字母提示效果.分享给大家供大家参考,具体如下: 开发工具:eclipse 运行环境:htc G9 android2.3.3 话不多说,先看效果图 其实左右边的A~Z是一个自定义的View,它直接覆盖在ListView上. MyLetterListView: public class MyLetterListView extends View { OnTouchingLetterChangedListener onTouching

  • Ubuntu+python将nii图像保存成png格式

    这里介绍一个nii文件保存为png格式的方法. 这篇文章是介绍多个nii文件保存为png格式的方法: https://www.jb51.net/article/165692.htm 系统:Ubuntu 16.04 软件: python 3.5 先用pip安装nibabel.numpy.imageio.os. import nibabel as nib import numpy as np import imageio import os def read_niifile(niifile): #读

  • Python合并ts文件至mp4格式及解密教程详解

    m3u8是什么格式?m3u8是苹果公司推出的视频播放标准,是m3u的一种,只是编码格式采用的是UTF-8. 使用m3u8格式文件主要因为可以实现多码率视频的适配,视频网站可以根据用户的网络带宽情况,自动为客户端匹配一个合适的码率文件进行播放,从而保证视频的流畅度. m3u8准确来说是一种索引文件,使用m3u8文件实际上是通过它来解析对应的放在服务器上的视频网络地址,从而实现在线播放. 它将视频切割成一小段一小段的ts格式的视频文件,然后存在服务器中(现在为了减少I/o访问次数,一般存在服务器的内

  • python报错TypeError: Input z must be 2D, not 3D的解决方法

    目前,在使用python处理一个nc文件绘制一个风场图时,出现了以下报错 虽然图片画出来了,但是很丑而且没有理想的填充颜色! 但是不知道为啥,但是参考画图过程,分析这个其中的Z应该指的绘制等高线中的这个函数:matplotlib.pyplot contourf  中使用到的Z! 而这个函数的用法为 coutour([X, Y,] Z,[levels], **kwargs) 在这里提出,matplotlib.pyplot contourf 是用来绘制三维等高线图的,不同点是contour()是绘制

随机推荐