« 読了:Hyndman & Fan (1996) 標本分位数の出力はソフトによってちがう | メイン | ちょっとした覚書:Rの環境を操作する関数 »
2019年10月29日 (火)
話はちがうが(なにからだ)、Stanを使っていると、ときどきデータ型について混乱してしまうことがある。数日前も同僚が書いたコードをみていて、しばしわけがわからなくなってしまった。私が悪いんです、すいません。
松浦「StanとRでベイズ統計モデリング」の9章を熟読すればよい問題なのだが(自宅にも職場にも置いてあるんだし)、毎度毎度めくっているのもどうかという気がしてきたので、Users Guide (2.19)の15-16章を眺めてメモを取った。
15. Matrices, Vectors, and Arrays
- Stanのデータ型は、int, real, vector, row_vector, matrixの5つ。
- どの型も配列にできる。たとえばreal b[M,N]は2次元の配列。
- サイズを動的に変えることはできない。
- 2次元配列と行列を比べると、行列のほうがメモリがちょっと小さい。行列はメモリ上で固まってストアされているが配列はそうでない。
- 行列は列優先順でストアされているので、matrix[M,N] aならさきに1:Nでループしたほうが速い。配列は行優先順ではいっているので、real b[M,N] ならさきに1:Mでループしたほうが速い。そして行列のほうが速い。
- matrix[M,N] aに対して a[m] を呼ぶと行ベクトルが返るけど、これは遅い。row_vector[N] b[M]に対して b[m]を呼んだほうが速い。
- 行列の行列演算は速い。
- コンテナとしてみたとき、vector, row_vector, スカラーの一次元配列は同じ(ただし整数が入れられるのは配列だけだけど)。
16. Multiple Indexing and Range Indexing
- たとえば int c[3] に(5,9,7)をいれといて、ind indx[4]に(3,3,1,2)をいれとくと、c[idxs]は(7,7,5,9)を返す。こういうのがmultiple indexing。
- その特殊ケースとしてrange indexing (slicing)がある。c[1:2]とかね。c[2:size(c)]ってのもあり。c[:2]はc[1:2]の略記になる。c[]とc[:]は同じ。
16章にはほかにもいろいろ書いてあるんだけど、なんだかめんどくさくなってきたので、まあいいや、別の機会にしよう。
雑記:データ解析 - ちょっとした覚書:Stanのデータ型について