在Armadillo的.print()功能是專做 「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'; }
}
}
注意的是,上述代碼只打印墊類型(這是一個typedef爲Mat <雙>)和派生類型如VEC和rowvec。如果你想打印任何模板墊< T>類型(以及派生類型山口< 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'; }
}
}
此外,如果您希望能夠打印任何(如: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'; }
}
}
注意的是,上述代碼將使基質的副本如果表達式僅僅是一個單一的矩陣。如果需要效率,則需要模板元編程來避免複製,這超出了原始問題的範圍。
對此我不太瞭解,但它聽起來像行分隔符是'rowvec'類型固有的東西 – SShaheen
這在打印矩陣時也很明顯,我在示例中編輯了矩陣。 –