如何在列中打印特征变量?

amo*_*amo 5 c++ string-formatting eigen

我在Eigen :: Vector2f变量中有一堆数据.我想在列中打印它,但我最终会得到不均匀的结果:

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
Run Code Online (Sandbox Code Playgroud)

我正在使用的打印声明是这样的:

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

格式语句的精度似乎表示非零数字的数量,而不是小数位数.例如,如果我将精度设置为2,我会得到像2,-0.044和2.8这样的数字.无论如何,列都没有对齐.

有关如何使我的列对齐的任何想法?所有这些额外空间都来自哪里?

iNF*_*TEi 6

Eigen :: IOFormat的第二个参数控制列对齐设置.但是,由于您使用转置打印列向量,因此它没有任何效果.

我得到以下输出,代码如下所示:

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
Run Code Online (Sandbox Code Playgroud)

对应代码:

#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;
  }
}
Run Code Online (Sandbox Code Playgroud)