2008年2月24日日曜日

テンプレートのイテレータ

vector < T > ::iterator のような表現はTが値か型か確定しないと解釈できないので

typename vector < T > ::iterator

と表記する。

vector < T* > ::iterator でも通る。

2008年2月18日月曜日

TRカード

TRカードについてはとりあえず並行移動だけサポートして回転移動は後に回す。

但し今後の実装を考慮し、4x4アフィン行列にTRカードの内容を読み込んだと仮定して他のルーチンを作成する。


制約:
  • TRカードは並行移動のみサポート

TODO
  • 回転移動の4x4行列への読み込み

boost::xpressive でも警告

boost::ublasと同様にboost::xpressive::sregexもインスタンス化するとその場所で、コピーコンストラクタで初期化していない、という警告が出る。
boost 1.35以降で修正されることを期待して今は放置。当面xpressiveよりregexを使った方が良いのか。

2008年2月17日日曜日

doxygen 雛型(prototype)

doxygenで関数のコメントを付けるときの雛型(prototype)。


/*! \brief 短い説明

関数の詳しい説明

\param[in] 引数名1 引数1の説明
\param[in, out] 引数名2 引数2の説明
\retval 返り値 返り値の説明

\note 注釈
*/

- で箇条書き
-# で番号つき箇条書き

boost::numeric::ublas::matrixを使ってみる。

重要(FAQより)
  • パフォーマンスが必要な場合はコンパイル時に必ずNDEBUGを定義する→expression templateが有効になる。
  • 行列の積の積 prod(A, prod(B, C))がexpression templateにより遅くなる場合
    prod (A,matrix_type (prod (B, C)))
    prod (A, prod < matrix_type > (B, C))
    のようにして明示的に一時行列を導入すれば良い。(メモリ使用量は増える)
  • 要素への配列風アクセスも定義されているが一時オブジェクトが必要になるので(メモリ量的に)高くつく場合がある。(ublas overviewのcompatibilityより)

生成
  • 引数なしコンストラクタで0,0要素行列の生成 → resize(n,m)でn行m列に変形
  • コンストラクタ(n,m)でn行m列 行列を生成させる。
のどちらか。これら以外のコンストラクタはコピーコンストラクタだけ。


メンバ関数にあるもの
  • insert, resize, clear 等コンテナに共通する操作
  • イテレータ関連

演算子オーバーロードされているもの
  • スカラーと行列の四則演算
  • 行列同士の代入、加減
  • ストリームへの &lt&lt 等はboost/numeric/ublas/io.hppで定義

boost::numeric::ublas 以下にはmatrixに限らない、基本的な演算のための非メンバの関数が置かれている
  • prod ベクトル/行列とベクトル/行列の乗算
  • trans 転置

2008年2月15日金曜日

boost::ublas のコンテナでコンパイル時警告

boost::numeric::ublas::matrix を宣言・代入し、returnすると

base class ‘class boost::numeric::ublas::storage_array (略)’ should be explicitly initialized in the copy constructor

という警告が出る。インターネットで調べると
boost::numeric::ublas::vectorでの同様の警告に関する話題あり。

matrix なりvectorなりのコピーコンストラクタが基底クラス storage_array の初期化に失敗している様子。というか初期化していない。(エラーメッセージそのままだけど)

vectorの場合 boost/numeric/ublas/storage.hppの92行目と93行目の間に
storage_array < self_type,ALLOC > (),

と挿入すれば警告は消える。無視して次のリリースでの修正を待っても問題なさそう。
と書いてある。

しかし実際変更するとのtemplate引数は1つだというエラーが出るので
storage_array < self_type > (),

が正解と思われる。 boost 1.34 + g++4.1.2

2008年2月14日木曜日

現時点でのMCNPの拡張点

とりあえず入力ファイル読み取りの時点で考慮した、MCNPからの拡張を挙げる
  • READ カード:READ FILE=ファイル名 によるインクルードを採用(MCNPXでは既採用)
  • 多段インクルード:READ FILEで取り込んだファイル内でのREADカードを受け付ける
  • 前置継続指示(行頭空白5文字)と後置継続指示(&文字)が重複してもOK
  • m表現での浮動小数点形式を受け付ける:例、 1.5e2m は150mに解釈される。
処理過程上で不自然に拡張してしまったもの
  • 入力ファイルは小文字大文字は区別されるが、カード名では区別が無い。sDeFみたいな入力がOK.

2008年2月4日月曜日

boost::regex

smatch.position() はパターン該当部分の最初の位置を示す。


string str=" I want something to drink.";
regex pattern("something");
smatch m;
regex_search( str, m );

str.substr( 0, m.position() );


で文字列中のパターン該当部(パターン含む)以降を削除できる。

2008年2月3日日曜日

boost::lexical_cast

lexical_cast("6.02E23") 等浮動小数点数のキャストもOK
ただし、文字列前後に空白を含んでいるとキャスト失敗で、 bad_lexical_cast が投げられる。(boost 1.33。後のバージョンでは空白は適当に解釈されるというwebページを見た気がする。要確認)

定倍の1.5m 等の表記をlexical_castで変換すれば1.5e2mのような表記もアリ。

とりあえずテスト

bloggerでページを作ってみる。テスト。

WYSIWYGで
  • 箇条書き1
  1. 番号つき箇条書き


引用(blockquote)
等できるのが便利。
preタグは自分で書く必要がある。