読者です 読者をやめる 読者になる 読者になる

Boost.uBLAS の補完ライブラリの使い方 - その3

今回も前回紹介したuBLASの補完ライブラリの一部の機能について説明します.
今回説明するのは次の機能です.

  • sum
  • trace
  • diag_prod

sum は行列の全成分の和を返します.これは boost.numeric.ublas.sum の行列版です.
boost.numeric.ublas.sum は何故かベクトルにしか適用できないようになっています.
しかし,ベクトルに適用できる演算を自然な形で行列に拡張できるというのに,それが提供されていないのは一貫性の観点から問題であると思います.
trace は行列の対角成分の和を返します.私は何故これほど原始的な演算が uBLAS に実装されていないのか理解できません.行列のトレースは間違いなく線形代数の基本的な演算の一つであり,そして uBLAS 最大の特徴である遅延評価で実装されるべき最たるものです.というのも,M x N 行列のトレースの計算には min(M, N) 個の対角成分しか必要ないからです.実装も容易であるため,将来のバージョンでこの機能が uBLAS に取り込まれることを望んでやみません.
diag_prod は対角成分の積を返します.これも trace と同様に,遅延評価の恩恵を最大に受けられる演算の一つであろうと思います.


以下のテストコードでこれらの機能の動作を確認できます.

test.cpp

#include "numeric.hpp"
#include <boost/numeric/ublas/io.hpp>


int main()
{
    boost::numeric::ublas::matrix<double> m(3, 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 << m << std::endl;

    std::cout << numeric::ublas::sum(m) << std::endl;       // 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 = 45
    std::cout << numeric::ublas::trace(m) << std::endl;     // 1 + 5 + 9 = 15
    std::cout << numeric::ublas::diag_prod(m) << std::endl; // 1 * 5 * 9 = 45

    return 0;
}
  • VC9
  • g++ (GCC) 3.4.4 (cygming special)

でのコンパイルを確認しています.

実行してみると,正しく計算できていることが分かります.


次回は cross_prod について説明する予定です.
それでは.