理系学生日記

おまえはいつまで学生気分なのか

部分行列とる方法募集

boostのublasで部分行列を作る方法ねーかなーと思って、
いろいろ聞いたりしてテストしてみた。

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

int main() {
    typedef boost::numeric::ublas::matrix<double> dmatrix;
    dmatrix 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;

    // matrixとりあえず出力してみる
    std::cout << "matrix=" << m << std::endl;     

    // (0,0), (0,1), (1,0), (1,1)からなる部分行列作ってみる
    using boost::numeric::ublas::slice;
    boost::numeric::ublas::matrix_slice<dmatrix> ms( m, slice(0,1,2), slice(0,1,2));
    std::cout << "submatrix=" << ms << std::endl; 
    
    // 部分行列を変更
    ms(0,0)=100;                                  
    std::cout << "matrix=" << m << std::endl;     // 
}

結果。

matrix=[3,3]((1,2,3),(4,5,6),(7,8,9))
submatrix=[2,2]((1,2),(4,5))
matrix=[3,3]((100,2,3),(4,5,6),(7,8,9))

うひょーmatrixも変更されてるwww
よくdocumentみたら

a matrix referencing a non continues submatrix of elements in the matrix m.

http://www.boost.org/libs/numeric/ublas/doc/types_overview.htm

とか書いてありまして、あーリファレンスなのか。


そういうわけですので、ublasでリファレンスじゃない部分行列を楽にとる方法募集中。
画像処理っぽいことしたい。