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