Effective Modern C++ の日本語版が去年の9月に発売されていたことを今更知って,買う前に内容を調べていたときにC++11にstd::asyncという機能があることを知りました.調べてみると非常にスグレモノで感動したので使い方などのメモを書いておきます.
「プログラミング」カテゴリーアーカイブ
パストレーシングしてみた
ちょっと時間があったので,前々からやってみたかったパストレーシングのプログラムを書いてみました.実装にはmemoRandomさんのページを大いに参考にさせていただきました.
実装したのは一番簡単なNext Event Estimation有りのパストレーシングです.
実行結果はこんな感じです.
反復1回目 | 12回目 |
60回目 | 253回目 |
1222回目 | 6073回目 |
16384回目 |
自己組織化マップ
web上で見た自己組織化マップ(self organizing map)のデモプログラムがカッコ良かったので,自分でも実装してみました.実装の際は,以下のサイトが説明がわかりやすく非常に参考になりました.
自己組織化特徴マップ(SOM)
学習データはMNISTの手書き数字画像データセットを使っています.学習時の様子はこんな感じです.
最終結果はこんな感じです.学習が進むにつれて,数字形状に応じていい感じにクラスタができていくのが面白いですね.形の似ている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++の奥深さを実感しました.