mots quotidiens. | |
Daichi Mochihashi (持橋大地) daichi <at> ism.ac.jp | by hns, version 2.10-pl1. |
|
||||||||||||||||||||||||||||||||||||||||||||||||||
一日目のセッション『金融リスクと統計的学習』も勉強になりまくりでした。ただ, 普通半年で話す内容を30分で話す(極値統計学)という凄いことになっていた上, 午前中に休憩がなかったので, 集中力を維持するのが結構大変でした。 僕は極値統計学を予習していたので, 説明を超速で飛ばされても多少大丈夫でしたが, 普通は辛いかもという気が。それは音声セッションも同じで, 亀岡さんの 凄い話を最初に持ってきたのは正解だったな, と思ったわけですが(w, 来年は午前中 にも休憩を入れて, ゆっくり頭に入れて, 印象に残るようにする方がいいかも, というのが反省点でした。
ポスターセッションも, 赤穂さんも書かれています が, 実質査読がないのにどれも 非常にクオリティが高くて凄いなと。特に, いわゆるIBISコミュニティの中心的な 大学以外からも参加が結構あったのが素晴らしいと思いました。
一年間準備してきて思ったのは, 井手さんの采配の素晴らしさと, それからPCが
「全員」リーダーシップがあるというのがとにかく凄いなあと, 準備中から驚かされ
通しでした。普通, 日本の組織では一部が声を上げて他は黙って聞いているという
状況がよくありますが, それがなくて, 皆次々と行動を起こしていくという。
個人的には, 昼休みにIBISエライヒト会議みたいなもの(運営会議)に初めて参加して,
貴重な体験でした。まるで
ゼーレ
みたいだなあとか思いましたが, 普通に明るい部屋でした。(笑)
NLPの人には朗報?なことに, IBIS2009のプログラム委員奨励賞 は東大高木研の武井君の, PCFGの高速ベイズ学習でした。 自然言語処理の人向けに簡単に書くと, これは次のような話。
来年のIBIS 2010は東京だそうなので, 新しい統数研かと思っていたら, ホールに IBISの参加者が全員入らないかも, とか色々事情があるそうです。
泊まったホテルの部屋から, 海沿いに上のような風景が見えていて, 「何これ??和製モン・サン・ミシェル修道院か?」と思っていましたが, 帰りに散歩のついでに行ってみると, マリゾン という高速船乗り場&結婚式場だったことを知りました。
手前のかなり長い影は, 福岡タワーです。
ここから地下鉄西新駅に帰る途中, かの有名な
修猷館高校
の前を通りました。(というか, 西新駅のすぐ近くにあるようです。)
何というか, あからさまにエリート校な感じで驚きました。
(こんな感じ。)
すぐ隣の西南学院大学の
方が高校みたいで, 修猷館の方が大学のようでした。
修猷館の人はやたら母校に
プライドを持っているという話を周囲から色々聞いていましたが, まぁなるほどなぁ
というか..。
しかし, こんなニュータウンみたいな所にあるとは, 全然思っていませんでした。
double **matrix = dmatrix(rows, cols); for (i = 0; i < rows; i++) for (j = 0; j < cols; j++) if (matrix[i][j] > 0) ...のように使う。ただし, 単なる配列の配列なので, 行列の大きさ(rowsとcols) は別に覚えておく必要がある。
一番簡単な解決策は, ベクトルの場合は
typedef struct { double *content; int length; } dvector;のような構造体を定義しておいて
for (i = 0; i < v->length; i++) if (v->content[i]) ...のように使うことですが, これは v[i] のようにはアクセスできません (contentは構造体の先頭にあるが, lengthフィールドがあるため, 無理矢理 v[i] としてもオフセットが狂ってしまう)。
少し考えると, 後ろに length があるからいけないのであって, 前に持たせればよくね? ということで, 次のようなコードを書くと, C言語でも普通に配列に長さを持たせる ことができることに気付いた。
/* dvector2.c */ double * dvector (int size) { double *v; if ((v = (double *)calloc(size + 1, sizeof(double))) == NULL) { perror("dvector"); return NULL; } /* record size */ *((int *)v) = size; v += 1; return v; } void free_dvector (double *v) { free(v - 1); }ここで, dvector.h で
#define vsize(v) *((int *)(v-1))としておくと,
double *v = dvector(20); double **m = dmatrix(n, k); for (i = 0; i < vsize(v); i++) if (v[i] > 0) ... for (i = 0; i < mrows(m); i++) for (j = 0; j < mcols(m); j++) if (m[i][j] > 0) ...のように普通にMATLABのように使うことができ, 長さを覚えておく必要がない。 行列の場合にも同じことができ, 2つ分前に行数と列数を入れておいて, *((int *)) でアクセスすればok。下に dvector2.{c,h}, dmatrix2.{c,h} を置いておきます。
ポイントは, これは全く合法的なことをしているので, C言語なら必ず使えて,
外からは普通の double *, double ** と全く同じだということです。
これまで, 配列のサイズを変更する時は前の長さを与えないといけなかったり,
行列の場合は free() する場合もfree()するべき列の数を外から与えて
やらないといけませんでしたが, これで勝手に長さを自分で取得して
リサイズしたり, free() したりできるので, その点でも便利です。
唯一心配すべきなのは, double や double * にintが入らない場合ということですが,
sizeof(int) > sizeof(double) だったり, int がポインタのサイズより大きいような
変態的な環境は普通はないと思うので, 心配しなくてよさそうです
(thanks to 高林君)。
*2
これで, C言語の配列/行列もMATLABのように使えるようになりました。
#define matrix_val(m,i,j) m[i][j] #define vector_len(v) vsize(v) ..を用意しておいて,
#!/bin/sh # # indenter # if [ $# -lt 2 ]; then echo "usage: $0 replace.cpp source.c" exit 0 fi sed 's/^#/_CPP_DIRECTIVE_/g' $2 | cat $1 - | cpp -C -P | \ sed 's/^_CPP_DIRECTIVE_/#/g' | indent -bl -bli0 -psl -krのようなスクリプトを書くことで, 綺麗に変換することができました。
タイトル一覧 |