Отключить разрыв строки после печати вектора / матрицы броненосца (C ++)

Я использую 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();
}

Я собираю и работаю на Linux, используя GCC версии 4.4.6

g++ test.cpp -o test -larmadillo

2

Решение

.Распечатать() функция в броненосец предназначен для того, чтобы делатьдовольно-печатьMsgstr «.raw_print () функция уменьшает количество симпатичной печати (то есть не меняет представление чисел на научный формат), но все еще печатает переводы строк.

Если бы у этих функций было меньше функциональности, они не предоставили бы никакой дополнительной ценности по сравнению с простым циклическим просмотром элементов и выводом их в поток пользователя (такой как соиЬ). Таким образом, решение заключается в том, чтобы просто выполнить печать самостоятельно, с помощью такой функции, как:

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'; }
}
}

Обратите внимание, что приведенный выше код печатает только мат тип (который является typedef для Мат < double>) и производные типы, такие как VEC а также rowvec. Если вы хотите напечатать любой шаблонный мат < T> type (и производные типы Col < T> и ряд < 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'; }
}
}

Обратите внимание, что приведенный выше код создаст копию матрицы, если выражение является просто одной матрицей. Если требуется эффективность, шаблонное метапрограммирование требуется, чтобы избежать копирования, что выходит за рамки исходного вопроса.

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector