脳ざらし紀行


2006-05-04

_ Boost C++ Libraryプログラミング

買った。著者は http://www.kmonos.net/wlog/ の人。世界は狭いね。おもな目的は Boost の線形代数ライブラリ uBlas 。と思ったら、uBlas の説明は2ページしか載っていません!! というのは、立ち読みして知っていたんですが、Boost の他の機能とuBlasを一緒に使えば、もっとプログラミングが楽になりそうなんで。それと、uBlasのコードを理解するのに、Boostの基本的なことを知っておく必要がありそうなんで。

で、唐突に、例えば (max{v1, v2})[i] = max{v1 [i], v2 [i]} のようなベクトル同士の2項演算を新しく定義したい、しかも Expression Template を使って。という場合は、以下のようなコードになる。

namespace boost { namespace numeric { namespace ublas {

  template<class T1, class T2>
  struct scalar_max: public scalar_binary_functor<T1, T2> {
    typedef typename scalar_binary_functor<T1, T2>::argument1_type argument1_type;
    typedef typename scalar_binary_functor<T1, T2>::argument2_type argument2_type;
    typedef typename scalar_binary_functor<T1, T2>::result_type result_type;
    
    static BOOST_UBLAS_INLINE result_type
    apply (argument1_type t1, argument2_type t2) {
      return t1 >= t2 ? t1 : t2;
    }
  };
  
  // (max{v1, v2})[i] = max{v1 [i], v2 [i]}
  template<class E1, class E2>
  BOOST_UBLAS_INLINE
  typename vector_binary_traits<
    E1,
    E2,
    scalar_max<typename E1::value_type, typename E2::value_type>
  >::result_type
  max (const vector_expression<E1> &e1,
       const vector_expression<E2> &e2) {    
    typedef typename vector_binary_traits<
      E1,
      E2,
      scalar_max<typename E1::value_type, typename E2::value_type>
    >::expression_type expression_type;
    
    return expression_type (e1 (), e2 ());
  }

}}}

始めは人間には理解不可能と思われた uBlas のコードだけど、慣れたのか何をやっているかは分かるようになってきた。

本の画像

お名前:
E-mail:
コメント:
本日のリンク元

最近のコメント

2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|04|05|
2011|04|
2012|03|07|
2013|01|02|07|
トップ «前の日記(2006-05-02) 最新 次の日記(2006-05-05)» 編集