Boost.uBLAS の補完ライブラリの使い方 - その1
今回は前回紹介したuBLASの補完ライブラリの一部の機能について説明します.
今回説明するのは次の機能です.
- abs
- sqrt
- square
- log
- log10
- apply_to_all
使い方はとても簡単で,行列やベクトルにこれらの関数を適用するだけです.
例えば abs を適用した場合,その行列あるいはベクトルのすべての要素に abs を適用した結果が返されます.
他の関数についても同様です.
以下のテストコードでこれらの機能の動作を確認できます.
test.cpp
#include "numeric.hpp" #include <boost/numeric/ublas/io.hpp> // numeric.ublas.apply_to_all で使用するファンクタを定義しておきます template <class T> struct plus_10 : boost::numeric::ublas::scalar_unary_functor<T> { static T apply(T t) { return t + 10; } }; int main() { boost::numeric::ublas::vector<double> v(3); boost::numeric::ublas::matrix<double> m(3, 3); v(0) = 1; v(1) = 2; v(2) = 3; m(0, 0) = 1; m(0, 1) = 2; m(0, 2) = 3; m(1, 0) = 4; m(1, 1) = 5; m(1, 2) = 6; m(2, 0) = 7; m(2, 1) = 8; m(2, 2) = 9; std::cout << v << std::endl; std::cout << m << std::endl; // すべての要素に abs を適用 std::cout << numeric::ublas::abs(-v) << std::endl; std::cout << numeric::ublas::abs(-m) << std::endl; // すべての要素に sqrt を適用 std::cout << numeric::ublas::sqrt(v) << std::endl; std::cout << numeric::ublas::sqrt(m) << std::endl; // すべての要素を自乗 std::cout << numeric::ublas::square(v) << std::endl; std::cout << numeric::ublas::square(m) << std::endl; // すべての要素に log を適用 std::cout << numeric::ublas::log(v) << std::endl; std::cout << numeric::ublas::log(m) << std::endl; // すべての要素に log10 を適用 std::cout << numeric::ublas::log10(v) << std::endl; std::cout << numeric::ublas::log10(m) << std::endl; // 次のように自分で定義したファンクタ(plus_10)を全要素に適用することもできます std::cout << numeric::ublas::apply_to_all(v, plus_10<double>()) << std::endl; std::cout << numeric::ublas::apply_to_all(m, plus_10<double>()) << std::endl; // apply_to_all は次のように呼び出すこともできます std::cout << numeric::ublas::apply_to_all<plus_10<double> >(v) << std::endl; std::cout << numeric::ublas::apply_to_all<plus_10<double> >(m) << std::endl; return 0; }
- VC9
- g++ (GCC) 3.4.4 (cygming special)
でのコンパイルを確認しています.
実行してみると,正しく計算できていることが分かります.
次回は numeric.ublas.norm_2_sq, numeric.ublas.norm_frobenius_sq について説明する予定です.
それでは.