2

私はアルマジロライブラリで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();
}

GCCバージョン4.4.6を使用して、Linuxでコンパイルおよび実行しています。

g++ test.cpp -o test -larmadillo
4

1 に答える 1

3

Armadillo.print()関数は、 「きれいな印刷」を行うように設計されています。.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 <double>のtypedef)とvecrowvecなどの派生タイプのみを出力することに注意してください。テンプレート化された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'; }
    }
  }

式が単純に単一の行列である場合、上記のコードは行列のコピーを作成することに注意してください。効率が必要な場合は、コピーを回避するためにテンプレートメタプログラミングが必要です。これは、元の質問の範囲を超えています。

于 2013-02-01T00:43:50.120 に答える