Saya mencoba menulis Eigen::VectorXd ke file CSV. Vektor berasal dari baris Eigen::MatrixXd. Fungsi saya didefinisikan sebagai berikut:

void writeMatrixToCSVwithID(fs::path path, VectorXd row, unsigned long int row_id){
    const static IOFormat CSVFormat(StreamPrecision, DontAlignCols, ", ", "\n");
    ofstream file(path.c_str(), std::ofstream::out | std::ofstream::app);
    row.resize(1, row.size());
    file << row_id << ", " << row.format(CSVFormat) << std::endl;
    file.close();
}

Masalahnya adalah ini menghasilkan file sebagai:

11, 0.247795
0.327012
0.502336
0.569316
0.705254
12, 0.247795
0.327012
0.502336
0.569316
0.705254

Keluaran yang diharapkan adalah:

11, 0.247795, 0.327012, 0.502336, 0.569316, 0.705254
12, 0.247795, 0.327012, 0.502336, 0.569316, 0.705254

Apa yang perlu saya ubah?

-1
newkid 24 Mei 2020, 17:44

1 menjawab

Jawaban Terbaik

Penyebab kesalahan adalah Eigen mengeluarkan VectorXd sebagai kolom. MatrixXd::row(id) mengembalikan Block yang tampaknya menampilkan ekstrak baris atau kolom sebagai kolom!

Jadi, daripada melewatkan baris VectorXd, sekarang saya melewatkan baris tersebut sebagai MatrixXd. Objek IOFormat diinisialisasi dengan pemisah baris sebagai ','.

void writeMatrixToCSVwithID(fs::path path, MatrixXd row, unsigned long int row_id){
    const static IOFormat CSVFormat(StreamPrecision, DontAlignCols, ", ", ", ");
    ofstream file(path.c_str(), std::ofstream::app);
    row.resize(1, row.size()); // Making sure that we are dealing with a row.
    file << row_id << ", " << row.format(CSVFormat) << std::endl;
    file.close();
}

Ini menghasilkan output bijaksana baris yang diinginkan.

1
newkid 24 Mei 2020, 18:01