Chandler@Berlin -30ページ目

Chandler@Berlin

ベルリン在住

Page 50: Stratified

Stratified という言葉は素人には聞き慣れない言葉である.Monte-Carlo 法では乱数を使うが,その場合,clumping ということが発生する可能性がある.乱数は次に予測できないものであり,1, 1, 1, 1, ..., 1 と 1 がいくつも続くかもしれない.これについては Knuth の本の乱数の話(D.E.Knuth, The Art of Computer Programming, Vol.2 Random numbers)が面白い.その場合は図1の左のような sampling pattern が発生するかもしれない.図1の左ではたまたまある場所を sample しないとか,sample しすぎるというようなことが発生する.つまりサンプリングに偏りが発生している.これが clumping であり,ある意味運が悪かったということである.sampling 数を増やしていけば通常は解決するが,それにはコストがかかる,つまり計算に時間がかかる.そこで,計算時間はそのままで,sampling をいくつかの領域に分けて行えば,ある程度運が悪くても全体を sample することができる.このような手法を Stratified と言う.それでは全部均一にすればいいかというとそうするとサンプリング定理によって aliasing ができてしまう.Quasi-Monte-Carlo 法は良い Stratified 法であるとは友人は言っていた.



Chandler@Berlin-stratified

Figure 1. Stratified example. Left example of random 12 samples (clumping problem), Right example of 2x2 stratified random 12 samples


謝辞

友人の Daniel S. と Leonhard G. に Stratified とは何かということについての質問に答えて下さったことに感謝する.
OpenMesh (http://www.openmesh.org) でちょっとしたものを作ろうと思って以前の project を compile したら何故か以下の template の new の型が悪いという error のためにコンパイルできない.

/usr/X11R6/bin/g++ -Wp,-MD,Ubuntu9.04/VisOMTriMeshDNode.dep -DHAVE_SSTREAM -DUSE_GMU_GERR -std=c++0x -Wall -Wnon-virtual-dtor -Woverloaded-virtual -DARCH_LINUX-DCOMP_GCC -I/usr/X11R6/include -I/usr/X11R6/include -I/usr/include/tcl8.4 -I/usr/include/qt4 -I/usr/include/qt4/QtCore -I/usr/include/qt4 -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtNetwork -I/usr/include/qt4/QtOpenGL -I/opt/OpenMesh/src -I/home/project/shared_proj -fPIC -g -Wno-uninitialized -D_INCTEMP -DUSE_GMU_GERR -DGMU_DBG_STRIPPATH=\"ALL\" -o Ubuntu9.04/VisOMTriMeshDNode.o -c VisOMTriMeshDNode.cc
/usr/include/c++/4.3/ext/new_allocator.h: In member function 'void __gnu_cxx::new_allocator<_Tp>::construct(_Tp*, _Args&& ...) [with _Args = long int, _Tp = OpenMesh::BaseProperty*]':
/usr/include/c++/4.3/bits/stl_vector.h:703: instantiated from 'void std::vector<_Tp, _Alloc>::push_back(_Args&& ...) [with _Args = long int, _Tp = OpenMesh::BaseProperty*, _Alloc = std::allocator<OpenMesh::BaseProperty*>]'
/opt/OpenMesh/src/OpenMesh/Core/Utils/PropertyContainer.hh:104: instantiated from 'OpenMesh::BasePropHandleT<T> OpenMesh::PropertyContainer::add(const T&, const std::string&) [with T = OpenMesh::Attributes::StatusInfo]'
/opt/OpenMesh/src/OpenMesh/Core/Mesh/BaseKernel.hh:133: instantiated from 'void OpenMesh::BaseKernel::add_property(OpenMesh::VPropHandleT<T>&, const std::string&) [with T = OpenMesh::Attributes::StatusInfo]'
/opt/OpenMesh/src/OpenMesh/Core/Mesh/ArrayKernel.hh:486: instantiated from here
/usr/include/c++/4.3/ext/new_allocator.h:114: error: invalid conversion from 'long int' to 'OpenMesh::BaseProperty*'


以前コンパイルできたのに何故できないのかと,まずは OpenMesh を RC3 からRC5 に update したが,同じエラーである.私の嫌いな template のinstantiation error だ.いったいどこから long int が来ているのかとコードを読むこと3時間,-std=c++0x が悪いことに気がついた.しばらく前に hash_map はstandard でなく,やがて unordered_map になるというので,この option をセットしたのを忘れていた.また一日無駄に過ごしてしまった.
司馬遼太郎の「竜馬がゆく」をようやく読み終えた.問題は本の入手であった.今回は友人の姉が日本から訪ねてくるというところを無理にお願いして最後の2巻を入手した.本さえ入手すればまずその日のうちに読み終えてしまう,いや,終えるまで止まらない面白さである.司馬遼太郎の他の本があまり面白くなかった私は,長いことこの本を読まずに生きてきたが,なんという馬鹿なことをしたものだろうかと今は思う.高校生の時にはあまりわからなかったのだ.しかしもしかしたらまだ未熟なために理解できなかったのかもしれない.

竜馬は穏やかな海でありながら,私の心を燃やし,熱くさせる.

面白き,こともなき世を,面白く,
住みなすものは心なりけり. 高杉晋作

常日頃,闇に覆わる我が心,
光となるは,竜馬の言葉. 山内斉