Я использую 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
.Распечатать() функция в броненосец предназначен для того, чтобы делатьдовольно-печать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'; }
}
}
Обратите внимание, что приведенный выше код создаст копию матрицы, если выражение является просто одной матрицей. Если требуется эффективность, шаблонное метапрограммирование требуется, чтобы избежать копирования, что выходит за рамки исходного вопроса.
Других решений пока нет …