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 について説明する予定です.
それでは.