以制表符分隔的方式将特征向量写入库
Writing Eigen vector to a library in a tab delimited fashion
我目前正在 for 循环期间将一堆值写入特征数组。我想在 for 循环的每次迭代之后以制表符分隔的方式将该 Eigen 数组的状态写入该文件。然而,按照我目前正在做的方式,我正在编写文件,它只是将特征数组的值附加到前一个向量已经存在的列上。结果是文件为 1 列,即 200,000 个条目长,而它们应该是 200 列,即 1000 个条目长。下面的快速示例代码显示了该过程。
#include<iostream>
#include<fstream>
#include<Eigen>
using Eigen::VectorXd;
int main()
{
std::ofstream myfile1;
VectorXd en(1000);
std::string energyname = "Energies.txt";
myfile1.open(energyname);
for (int i = 0; i < 200; i++)
{
for (int j = 0; j < 1000; j++)
{
en(j) = 10;
}
myfile1 << en << std::endl;
}
}
我该如何改写它,以便它不会将代码附加到输出末尾的背面
std::endl
将字符表示为 \n
在Linux中,这足以标记一行的结尾。
但是在Windows中使用了两个字符:\r\n
(a.k.a.'LF-CR')
如果您使用简单的 reader(记事本)阅读您的文件,如果行尾标记只是 \n
,它不会分隔行
使用 LFCR 标记,您的代码可能如下所示:
myfile1 << en << "\r\n";
VectorXd
是列向量。如果你真的想要一个行向量,你需要 RowVectorXd
:
#include <iostream>
#include <fstream>
#include <Eigen>
using Eigen::RowVectorXd;
int main()
{
std::ofstream myfile1;
RowVectorXd en(1000);
std::string energyname = "Energies.txt";
myfile1.open(energyname);
for (int i = 0; i < 200; i++)
{
for (int j = 0; j < 1000; j++)
{
en(j) = 10;
}
myfile1 << en << std::endl;
}
}
如果你确实需要一个列向量,并且只想打印这个列向量的转置,你可以使用Eigen::IOFormat
将行尾分隔符从"\n"
更改为" "
。这是 IOFormat
的第 4 个参数,因此我们需要将默认值重新传递给前 3 个参数。
#include<iostream>
#include<fstream>
#include<Eigen>
using Eigen::VectorXd;
using Eigen::IOFormat;
using Eigen::StreamPrecision;
int main()
{
std::ofstream myfile1;
VectorXd en(1000);
std::string energyname = "Energies.txt";
myfile1.open(energyname);
IOFormat column_transpose_format(StreamPrecision, 0, " ", " ");
for (int i = 0; i < 200; i++)
{
for (int j = 0; j < 1000; j++)
{
en(j) = 10;
}
myfile1 << en.format(column_transpose_format) << std::endl;
}
}
这些都没有经过测试。
我目前正在 for 循环期间将一堆值写入特征数组。我想在 for 循环的每次迭代之后以制表符分隔的方式将该 Eigen 数组的状态写入该文件。然而,按照我目前正在做的方式,我正在编写文件,它只是将特征数组的值附加到前一个向量已经存在的列上。结果是文件为 1 列,即 200,000 个条目长,而它们应该是 200 列,即 1000 个条目长。下面的快速示例代码显示了该过程。
#include<iostream>
#include<fstream>
#include<Eigen>
using Eigen::VectorXd;
int main()
{
std::ofstream myfile1;
VectorXd en(1000);
std::string energyname = "Energies.txt";
myfile1.open(energyname);
for (int i = 0; i < 200; i++)
{
for (int j = 0; j < 1000; j++)
{
en(j) = 10;
}
myfile1 << en << std::endl;
}
}
我该如何改写它,以便它不会将代码附加到输出末尾的背面
std::endl
将字符表示为 \n
在Linux中,这足以标记一行的结尾。
但是在Windows中使用了两个字符:\r\n
(a.k.a.'LF-CR')
如果您使用简单的 reader(记事本)阅读您的文件,如果行尾标记只是 \n
使用 LFCR 标记,您的代码可能如下所示:
myfile1 << en << "\r\n";
VectorXd
是列向量。如果你真的想要一个行向量,你需要 RowVectorXd
:
#include <iostream>
#include <fstream>
#include <Eigen>
using Eigen::RowVectorXd;
int main()
{
std::ofstream myfile1;
RowVectorXd en(1000);
std::string energyname = "Energies.txt";
myfile1.open(energyname);
for (int i = 0; i < 200; i++)
{
for (int j = 0; j < 1000; j++)
{
en(j) = 10;
}
myfile1 << en << std::endl;
}
}
如果你确实需要一个列向量,并且只想打印这个列向量的转置,你可以使用Eigen::IOFormat
将行尾分隔符从"\n"
更改为" "
。这是 IOFormat
的第 4 个参数,因此我们需要将默认值重新传递给前 3 个参数。
#include<iostream>
#include<fstream>
#include<Eigen>
using Eigen::VectorXd;
using Eigen::IOFormat;
using Eigen::StreamPrecision;
int main()
{
std::ofstream myfile1;
VectorXd en(1000);
std::string energyname = "Energies.txt";
myfile1.open(energyname);
IOFormat column_transpose_format(StreamPrecision, 0, " ", " ");
for (int i = 0; i < 200; i++)
{
for (int j = 0; j < 1000; j++)
{
en(j) = 10;
}
myfile1 << en.format(column_transpose_format) << std::endl;
}
}
这些都没有经过测试。