我在犰狳库中使用C ++。当我打印矢量或矩阵时,在矢量/矩阵之后总是包含换行符,即使使用.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();
}
我正在使用GCC 4.4.6版本在Linux上编译和运行
g++ test.cpp -o test -larmadillo
答案 0 :(得分:3)
.print()中的Armadillo功能旨在执行“pretty-printing”。 .raw_print()函数减少了漂亮打印的数量(即,它不会将数字表示更改为科学格式),但仍会打印换行符。
如果这些函数具有更少的功能,那么它们不会提供额外的价值,只需循环遍历元素并将它们转储到用户流(例如 cout )。因此,解决方案就是通过以下功能自行完成打印:
inline
void
my_print(const mat& X)
{
for(uword i=0; i < X.n_elem ++i) { cout << X(i) << ' '; }
}
如果你想要最少量的漂亮印刷,每行末尾都有换行符(最后一行除外),试试这个:
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&lt; double&gt;的typedef)和派生类型,例如 vec 和 rowvec 。如果你想打印任何模板Mat&lt; T>类型(以及派生类型Col&lt; T&gt;和Row&lt; T&gt;),请尝试以下操作:
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'; }
}
}
此外,如果您希望能够打印任何犰狳矩阵表达式(例如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'; }
}
}
请注意,如果表达式只是一个矩阵,则上面的代码将生成矩阵的副本。如果需要效率,则需要使用模板元编程来避免复制,这超出了原始问题的范围。