Функция .print() в Armadillo предназначен для "красивой печати". Функция .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 (который является typedef для Mat ‹ double > ) и производные типы, такие как vec и rowvec. Если вы хотите напечатать любой шаблонный тип 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'; }
}
}
Обратите внимание, что приведенный выше код создаст копию матрицы, если выражение представляет собой просто одну матрицу. Если требуется эффективность, требуется метапрограммирование шаблона, чтобы избежать копирования, что выходит за рамки исходного вопроса.
person
mtall
schedule
01.02.2013
rowvec
- person SShaheen   schedule 31.01.2013