買った。著者は 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 のコードだけど、慣れたのか何をやっているかは分かるようになってきた。
最近のコメント