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でリファレンスじゃない部分行列を楽にとる方法募集中。
画像処理っぽいことしたい。