boostのbanded_matrixの使い方が良く判らん
boost/numeric/ublasには、帯行列用のbanded_matrixクラスがある。数学的には、が帯行列ならばの計算はなはず。という訳で、実験してみたんだけど、どうも、banded_matrixを使ってもベクトルとの掛け算に掛かっている気がする。以下ソース。
#include <boost/numeric/ublas/banded.hpp> #include <boost/numeric/ublas/vector.hpp> #include <boost/numeric/ublas/io.hpp> #include <ctime> #include <iostream> using namespace boost::numeric; using namespace boost; using namespace std; void makeBigMat(ublas::matrix<double>& m, const size_t n){ m.resize(n, n); } void makeBigBandMat(ublas::banded_matrix<double>& bm, const size_t n, const size_t l, const size_t u){ bm.resize(n, n, l, u); } void makeBigVec(ublas::vector<double>& v, const size_t n){ v.resize(n); } int main(int argc, char* argv[]){ const int numSize = atoi(argv[1]); const int sizeBy = atoi(argv[2]); const int numIter = atoi(argv[3]); vector<int> n(numSize); n[0] = 10; for(size_t i = 1; i < n.size(); i++){ n[i] = sizeBy + n[i - 1]; } for(size_t i = 0; i < n.size(); i++){ ublas::matrix<double> mat; makeBigMat(mat, n[i]); ublas::banded_adaptor<ublas::matrix<double> > adp(mat, 1, 1); ublas::banded_matrix<double> band; makeBigBandMat(band, n[i], 1, 1); ublas::vector<double> v, ret(n[i]); makeBigVec(v, n[i]); clock_t start, end, normal, adaptor, banded; start = clock(); for(size_t j = 0; j < numIter; j++){ ublas::noalias(ret) = ublas::prod(mat, v); } end = clock(); normal = end - start; start = clock(); for(size_t j = 0; j < numIter; j++){ ublas::noalias(ret) = ublas::prod(adp, v); } end = clock(); adaptor = end - start; start = clock(); for(size_t j = 0; j < numIter; j++){ ublas::noalias(ret) = ublas::prod(band, v); } end = clock(); banded = end - start; cout << n[i] << "\t" << normal << "\t" << adaptor << "\t" << banded << endl; } return 0; }
- ublas::noaliasは、一時オブジェクトを減らすためのおまじない。
- 最初、forの中身をublas::prod(mat, v); etc だけにしてたら、行列のサイズを変えても計算時間が全く変わらないのでびびる。これは、template expressionという技術で、中身が本当に必要になるまで計算を遅らせているからみたいである。boost恐るべし。
- デバッガで簡単に追ってみただけだと、banded_matrixだからと言って特別に変わっているような部分が見当たらないので、単にprod関数を使うだけじゃだめなのかも。
最近勉強したこと、とか、最近の生活風景
- ノンパラ本終わり
- 作者: P.J. Green,Bernard. W. Silverman
- 出版社/メーカー: Chapman and Hall/CRC
- 発売日: 1993/05/01
- メディア: ハードカバー
- クリック: 3回
- この商品を含むブログ (3件) を見る
- 行列代数
- 作者: D.A.ハーヴィル,伊理正夫
- 出版社/メーカー: シュプリンガー・ジャパン株式会社
- 発売日: 2007/06/28
- メディア: 単行本
- 購入: 14人 クリック: 176回
- この商品を含むブログ (11件) を見る
職場では、windows + visual studio一本槍。だがしかし、大学院の研究ではunixツールが使えた方が何かと楽かと思って、mac book proを購入(今は、airにすればよかったと激しく後悔)。で、開発はxcodeでやろうと思ったんだけど、これがまた、やっぱり使い慣れたvisual studioからの垣根が滅茶苦茶高い。全然使いこなせてない。まぁそのうち慣れるだろうけど。