Запись вектора Eigen в библиотеку в виде табуляции с разделителями - PullRequest
0 голосов
/ 07 апреля 2020

В настоящее время я записываю кучу значений в собственный массив во время для l oop. Я хочу записать состояние этого собственного массива в этот файл после каждой итерации для l oop в виде табуляции. Однако, как я сейчас и делаю, я пишу файл, и он просто добавляет значения собственного массива в столбец, в котором уже находится предыдущий вектор. В результате получаются файлы, состоящие из 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;
    }

}

Как мне перефразировать это, чтобы он не добавлял код в конец конца вывода

Ответы [ 2 ]

2 голосов
/ 07 апреля 2020

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, поэтому нам необходимо повторно передать значения по умолчанию для первых 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;
    }

}

Ни один из них не проверен.

0 голосов
/ 07 апреля 2020

std::endl помещает символ, представленный как \n
В Linux этого достаточно, чтобы отметить конец строки.

Но в Windows используются два символа: \r\n (он же 'LF-CR')

Если вы читаете ваш файл с помощью простого считывателя (Блокнот), он не будет разделять строки, если отметка конца строки будет \n

При использовании знака LFCR ваш код может выглядеть следующим образом:

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