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

boostでmatrixのrow vectorを取得する

boostの行列を扱っていて列や行ベクトルが必要になるときがある。そういう場合は、boost/numeric/ublas/matrix_proxy.hppを使う。

サンプルコード

#include <iostream>

#include <boost/numeric/ublas/io.hpp>
#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/matrix_proxy.hpp>

using namespace boost::numeric::ublas;

int main()
{
    matrix<double> B(5,5,0.0);
    for (std::size_t i = 0; i < 5; ++i) {
        B(i, i) = 1.0;
        matrix_row< matrix<double> > row(B, i);
        //inner product
        std::cout << inner_prod(row, row) << std::endl;
        std::cout << row << std::endl;
    }

    return 0;
}

出力例

1
[5](1,0,0,0,0)
1
[5](0,1,0,0,0)
1
[5](0,0,1,0,0)
1
[5](0,0,0,1,0)
1
[5](0,0,0,0,1)

matrix_rowのテンプレート引数には、行ベクトルが欲しい行列の型を入れる。

ベクトルと同じ様に内積や行列との積の計算ができる。

注意点

matrix_rowのコンストラクタで、Bがconstの場合は次のようにする。

#include <iostream>

#include <boost/numeric/ublas/io.hpp>
#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/matrix_proxy.hpp>

using namespace boost::numeric::ublas;

int main()
{
    const matrix<double> B(5,5,0.0); //const matrix<double>
    for (std::size_t i = 0; i < 5; ++i) {
        B(i, i) = 1.0;
        matrix_row< const matrix<double> > row(B, i); //const matrix<double>
        //inner product
        std::cout << inner_prod(row, row) << std::endl;
        std::cout << row << std::endl;
    }

    return 0;
}

参考サイト

Matrix Proxies - 1.55.0

Boost 数学関係ライブラリの使い方