プログラミング」カテゴリーアーカイブ

std::async

Effective Modern C++ の日本語版が去年の9月に発売されていたことを今更知って,買う前に内容を調べていたときにC++11にstd::asyncという機能があることを知りました.調べてみると非常にスグレモノで感動したので使い方などのメモを書いておきます.

続きを読む

パストレーシングしてみた

ちょっと時間があったので,前々からやってみたかったパストレーシングのプログラムを書いてみました.実装にはmemoRandomさんのページを大いに参考にさせていただきました.

実装したのは一番簡単なNext Event Estimation有りのパストレーシングです.
実行結果はこんな感じです.

image1 image12
反復1回目 12回目
image60 image253
60回目 253回目
image1222 image6073
1222回目 6073回目
image16384
16384回目

 

続きを読む

自己組織化マップ

web上で見た自己組織化マップ(self organizing map)のデモプログラムがカッコ良かったので,自分でも実装してみました.実装の際は,以下のサイトが説明がわかりやすく非常に参考になりました.
自己組織化特徴マップ(SOM)

学習データはMNISTの手書き数字画像データセットを使っています.学習時の様子はこんな感じです.

各グリッド(ノード)の色がそのグリッドに割当てられたラベル(数字)を表していて,赤色のグリッドは入力データに最も近いノードです.緑色はマウスクリックで選んだノードで,そのノードに対応する画像データが右上に表示されています.

mnist_som_
最終結果はこんな感じです.学習が進むにつれて,数字形状に応じていい感じにクラスタができていくのが面白いですね.形の似ている4と9なんかは近い位置にまとまっていて,境界はあやふやな感じになっています.

実行ファイルを置いておきますが,利用は自己責任(略)でお願いします.VC++2013ランタイムが要求されるかもしれません.
mnist_som.zip

カンマの罠

最近,C++で引っかかったこと.
以下の様なコードが期待した通りに動作しなくて,ちょっと悩んだ.

// double func( int i ) と
// double func( int i, int j ) のようにオーバーロードされている

double x = func( static_cast<int>( x, y ) );  // func( int i )が実行される
double y = func( static_cast<int>( x ), y );  // func( int i, int j )が実行される

引数を2つ取る方の関数を呼びたかったのですが,一回目の関数呼び出しのようにカッコの位置が間違っていて,オーバーロードされている他の関数が呼ばれてしまうというミスでした.このミスのわかりづらいところが,static_castに引数を2つ渡しても(渡すように見える書き方をしても)エラーにはならないというところです.

これまでstatic_castを関数のように捉えていたのですが,実際は関数ではなく演算子です.そのため,static_castのカッコ内にカンマで区切られた複数の変数があると,カンマオペレータが適用されて一つの変数と評価されるため,エラーとはならないんですね.

普段,カンマオペレータを使う頻度が少ないせいか,なかなか原因に気づけないでちょっと引っかかりました.このタイプの罠には初めて引っかかったので,改めてC++の奥深さを実感しました.