【问题标题】:Writing Eigen vector to a library in a tab delimited fashion以制表符分隔的方式将特征向量写入库
【发布时间】:2020-04-07 18:37:06
【问题描述】:

我目前在 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;
    }

}

如何改写它,使其不会将代码附加到输出末尾的后面

【问题讨论】:

  • 我编辑了这篇文章。这是在 Windows 机器上
  • 我正在使用视觉工作室。所有的编译都在那里进行。我通常使用记事本,但记事本++中的结果是相同的
  • 您是否验证了您的示例在此处重复了错误?您是否在实际程序中的任何地方都修改了myfile1 的语言环境?我不在我的 Windows 机器上,所以我无法自己验证这一点。
  • 不,这一切都在 for 循环中完成,文件名没有变化。
  • 您显示的代码(在修正了一些错别字之后)实际上会垂直输出每个向量,即基本上由'\n'(和一些填充空格)分隔的 200000 个值。请确保您发布重现您行为的确切代码(即minimal reproducible example)!您发布的代码甚至无法编译(由于一些琐碎的拼写错误)。

标签: c++ eigen eigen3


【解决方案1】:

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 的第四个参数,所以我们需要将默认值重新传递给前三个参数。

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

}

这些都没有经过测试。

【讨论】:

  • 编辑了我之前的评论
  • 忽略之前的评论。我按照你的要求把它放进去,效果很好。非常感谢!
【解决方案2】:

std::endl 将字符表示为\n
在 Linux 中,这足以标记行尾。

但在 Windows 中使用了两个字符:\r\n(又名“LF-CR”)

如果您使用简单的阅读器(记事本)阅读文件,如果行尾标记只是 \n,则不会分隔行

使用 LFCR 标记,您的代码可能如下所示:

myfile1 << en << "\r\n";

【讨论】:

  • 这是在 Windows 上编译、运行和执行的。应为 Windows 设置区域设置,std::endl 应扩大到 "\r\n"。 OP 还指出问题在 Notepad++ 上仍然存在。
  • std::endl 本质上等同于'\n' 后跟std::flush。是否将0x0a0x0d 0x0a 放入文件取决于语言环境以及文件是否以二进制模式打开。
  • 此更改没有解决我的问题。我仍然有错误,代码都连续返回 200,000 个条目的输出文件
猜你喜欢
  • 1970-01-01
  • 2015-07-09
  • 2023-03-10
  • 2016-05-09
  • 1970-01-01
  • 2016-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多