gpt4 book ai didi

c++ - 打印 Armadillo vector/矩阵后禁用换行符(C++)

转载 作者:搜寻专家 更新时间:2023-10-31 01:50:46 28 4
gpt4 key购买 nike

我在 armadillo 库中使用 C++。当我打印一个 vector 或矩阵时,在 vector/矩阵之后总是包含一个换行符,即使使用 .raw_print() 也是如此。有什么简单的方法可以禁用此行为吗?

最小的例子:

#include <iostream>
#include <armadillo>

using namespace std;
using namespace arma;

int main() {
rowvec a;
a << 0 << 1 << 2;
cout << a;
a.print();
a.raw_print();

mat b;
b << 0 << 1 << 2 << endr
<< 3 << 4 << 5 << endr
<< 6 << 7 << 8;
cout << b;
b.print();
b.raw_print();
}

我在 linux 上编译和运行,使用 GCC 4.4.6 版

g++ test.cpp -o test -larmadillo

最佳答案

.print()Armadillo 中发挥作用旨在执行“pretty-printing”。 .raw_print() 函数减少了 pretty-print 的数量(即它不会将数字的表示更改为科学格式),但仍会打印换行符。

如果这些函数的功能稍逊一筹,它们将不会比简单地循环遍历元素并将它们转储到用户流(例如 cout)提供任何附加值。因此,解决方案就是通过以下功能自己进行打印:

inline
void
my_print(const mat& X)
{
for(uword i=0; i < X.n_elem ++i) { cout << X(i) << ' '; }
}

如果你想要在每行末尾有换行符(最后一行除外)的情况下进行最少量的 pretty-print ,请尝试以下操作:

inline
void
my_print(const mat& X)
{
for(uword row=0; row < X.n_rows; ++row)
{
for(uword col=0; col < X.n_cols; ++col) { cout << X(row,col) << ' '; }

// determine when to print newlines
if( row != (X.n_rows-1) ) { cout << '\n'; }
}
}

请注意,上面的代码仅打印 mat 类型(这是 Mat 的类型定义)和派生类型,例如 vec行 vector 。如果要打印任何模板化的 Mat < T > 类型(以及派生类型 Col < T > 和 Row < T >),请尝试以下操作:

template<typename eT>
inline
void
my_print(const Mat<eT>& X)
{
for(uword row=0; row < X.n_rows; ++row)
{
for(uword col=0; col < X.n_cols; ++col) { cout << X(row,col) << ' '; }

// determine when to print newlines
if( row != (X.n_rows-1) ) { cout << '\n'; }
}
}

此外,如果您希望能够打印任何 Armadillo 矩阵表达式(例如 A+B),请尝试以下操作:

template<typename T1>
inline
void
my_print(const Base<typename T1::elem_type,T1>& expr)
{
const Mat<typename T1::elem_type> X(expr); // forcefully evaluate expression

for(uword row=0; row < X.n_rows; ++row)
{
for(uword col=0; col < X.n_cols; ++col) { cout << X(row,col) << ' '; }

// determine when to print newlines
if( row != (X.n_rows-1) ) { cout << '\n'; }
}
}

请注意,如果表达式只是一个矩阵,上面的代码将复制一个矩阵。如果要求效率,则需要模板元编程来避免复制,这超出了原题的范围。

关于c++ - 打印 Armadillo vector/矩阵后禁用换行符(C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14628896/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com