2013-01-31 83 views
2

我正在使用C++與犰狳庫。當我打印矢量或矩陣時,即使在使用.raw_print()時,矢量/矩陣後面總是包含換行符。有沒有簡單的方法來禁用這種行爲?打印後禁用換行符犰狳向量/矩陣(C++)

小例子:

#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 
+0

對此我不太瞭解,但它聽起來像行分隔符是'rowvec'類型固有的東西 – SShaheen

+0

這在打印矩陣時也很明顯,我在示例中編輯了矩陣。 –

回答

3

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 <雙>)和派生類型如VECrowvec。如果你想打印任何模板墊< 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'; } 
    } 
    } 

注意的是,上述代碼將使基質的副本如果表達式僅僅是一個單一的矩陣。如果需要效率,則需要模板元編程來避免複製,這超出了原始問題的範圍。

+0

謝謝!我想沒有「簡單」的做我想做的事,所以你的解決方案看起來不錯。 我的一個問題是,我想打印一個矩陣到一個文件,需要有一些特定的格式,但我想我必須手動完成。 –