以制表符分隔的方式将特征向量写入库

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;
    }

}

这些都没有经过测试。