How to print Eigen variables in columns?
Asked Answered
B

1

6

I have a bunch of data in Eigen::Vector2f variables. I want to print it in columns, but I end up with uneven results like so:

Vec1                  |Vec2                   |Vec3
   1.94609 -0.0863508 |  1.71155 -0.137481    |3.00915
   1.94609 -0.0863508 |1.57448 1.8755 |387.864
   1.94609 -0.0863508 |-0.415677 1.66801      |583.542
2.01589 1.94324       |  1.71155 -0.137481    |433.156
2.01589 1.94324       |1.57448 1.8755 |10.1969
2.01589 1.94324       |-0.415677 1.66801      |303.132
0.00212092 1.966      |  1.71155 -0.137481    |584.061
0.00212092 1.966      |1.57448 1.8755 |124.429
0.00212092 1.966      |-0.415677 1.66801      |17.5172

The print statement I'm using is this:

Eigen::IOFormat fmt(4, 0, ", ", "\n", "", "");
std::cerr << vec1.transpose().format(fmt) << "\t|" << vec2.transpose().format(fmt) << "\t|" << vec3.transpose().format(fmt) << std::endl;

The format statement's precision seems to mean the number of non-zero digits, not decimal places. For instance, if I set the precision to 2, I get numbers like 2, -0.044, and 2.8. And regardless of this, the columns are not aligned.

Any ideas on how to get my columns aligned? Where are all these extra spaces coming from?

Bunkhouse answered 21/7, 2014 at 23:33 Comment(0)
R
6

The scond parameter of the Eigen::IOFormat controls the Column Align settings. But since you are printing a column vector with transpose, it has no effect.

I get the following output with the code shown below:

vec1            |vec2           |vec3
-1      0.13    |-0.61  0.62    |0.17   -0.04
-0.3    0.79    |0.65   0.49    |-0.65  0.72
0.42    0.027   |-0.39  -0.97   |-0.82  -0.27
-0.71   -0.67   |0.98   -0.11   |-0.76  -0.99
-0.98   -0.24   |0.063  0.14    |0.2    0.21
-0.67   0.33    |-0.098 -0.3    |-0.89  0.22
0.57    0.61    |0.04   -0.4    |0.75   0.45
0.91    0.85    |0.079  -0.72   |-0.076 -0.53
0.72    -0.58   |0.56   0.69    |0.99   1
0.22    -0.22   |-0.47  -0.41   |0.68   -0.95

Corresponding code:

#include <iostream>
#include <Eigen/Dense>

using namespace Eigen;

int main() {
  std::cout << "vec1\t" << "\t|" << "vec2\t" << "\t|" << "vec3" << std::endl;
  for (int i = 0; i < 10; ++i) {
    Vector2f vec1, vec2, vec3;
    vec1.setRandom();
    vec2.setRandom();
    vec3.setRandom();

    const IOFormat fmt(2, DontAlignCols, "\t", " ", "", "", "", "");
    std::cout << vec1.transpose().format(fmt) << "\t|" << vec2.transpose().format(fmt) << "\t|" << vec3.transpose().format(fmt) << std::endl;
  }
}
Raddy answered 4/8, 2014 at 21:22 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.