mots quotidiens.
Daichi Mochihashi (持橋大地) daichi <at> ism.ac.jp by hns, version 2.10-pl1.

先月 2009年10月 来月
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

2009年10月22日(木) [n年日記]

#1 IBIS 2009

IBIS 2009 が終わって, 博多の九大医学部から京都に帰ってきました。 今年は各所への色々なアナウンスのせいか, 去年の160人 をさらにしのぐ215人の参加者があったそうで, 東京並みだそうです。
渡部さん と二人で企画した二日目のセッション 『音声・音響処理と機械学習』 も無事に終わり, 内容の濃い話が続いて, 個人的にはかなり面白いセッションになった のではないかと思いました(多分)。 上のページから講演者の方の発表スライドがすべて見られますのでどうぞ。

一日目のセッション『金融リスクと統計的学習』も勉強になりまくりでした。ただ, 普通半年で話す内容を30分で話す(極値統計学)という凄いことになっていた上, 午前中に休憩がなかったので, 集中力を維持するのが結構大変でした。 僕は極値統計学を予習していたので, 説明を超速で飛ばされても多少大丈夫でしたが, 普通は辛いかもという気が。それは音声セッションも同じで, 亀岡さんの 凄い話を最初に持ってきたのは正解だったな, と思ったわけですが(w, 来年は午前中 にも休憩を入れて, ゆっくり頭に入れて, 印象に残るようにする方がいいかも, というのが反省点でした。

ポスターセッションも, 赤穂さんも書かれています が, 実質査読がないのにどれも 非常にクオリティが高くて凄いなと。特に, いわゆるIBISコミュニティの中心的な 大学以外からも参加が結構あったのが素晴らしいと思いました。

一年間準備してきて思ったのは, 井手さんの采配の素晴らしさと, それからPCが 「全員」リーダーシップがあるというのがとにかく凄いなあと, 準備中から驚かされ 通しでした。普通, 日本の組織では一部が声を上げて他は黙って聞いているという 状況がよくありますが, それがなくて, 皆次々と行動を起こしていくという。
個人的には, 昼休みにIBISエライヒト会議みたいなもの(運営会議)に初めて参加して, 貴重な体験でした。まるで ゼーレ みたいだなあとか思いましたが, 普通に明るい部屋でした。(笑)

NLPの人には朗報?なことに, IBIS2009のプログラム委員奨励賞 は東大高木研の武井君の, PCFGの高速ベイズ学習でした。 自然言語処理の人向けに簡単に書くと, これは次のような話。

この論文だけ審査員の評価が全員一致したため, 二位を作らず単独受賞になりましたが, 他の論文も非常にレベルが高く, 技術的な質は勝るとも劣らない, という理解は共通 していたと思います。
予め査読をするのが結構大変だったので, 来年も同じようにするかはよくわからない のですが..。

来年のIBIS 2010は東京だそうなので, 新しい統数研かと思っていたら, ホールに IBISの参加者が全員入らないかも, とか色々事情があるそうです。

・ -

以下おまけ。

泊まったホテルの部屋から, 海沿いに上のような風景が見えていて, 「何これ??和製モン・サン・ミシェル修道院か?」と思っていましたが, 帰りに散歩のついでに行ってみると, マリゾン という高速船乗り場&結婚式場だったことを知りました。
その時は marine+liaison なのだろうと思いましたが, 多分 marine+marry+liaison 辺りなのだと思う。モンサンミシェルというのもあながち間違いではなかった模様。 *1 下のようにカフェでお昼を食べました。

手前のかなり長い影は, 福岡タワーです。
ここから地下鉄西新駅に帰る途中, かの有名な 修猷館高校 の前を通りました。(というか, 西新駅のすぐ近くにあるようです。) 何というか, あからさまにエリート校な感じで驚きました。 (こんな感じ。) すぐ隣の西南学院大学の 方が高校みたいで, 修猷館の方が大学のようでした。
修猷館の人はやたら母校に プライドを持っているという話を周囲から色々聞いていましたが, まぁなるほどなぁ というか..。 しかし, こんなニュータウンみたいな所にあるとは, 全然思っていませんでした。


*1: 今調べたら, 実際にそれがデザインコンセプトのようです。

2009年10月30日(金) [n年日記]

#1 C array/matrix with size

C言語では標準では matrix[7][20] のようにサイズが決まっている場合以外は 多次元配列は使えないが, 「1次元配列の配列」を作ると *1 matrix[i][j] のように使うことができるので, 配列の配列を確保する dmatrix.c というファイルを書いて便利に使っている。
これは
double **matrix = dmatrix(rows, cols);
for (i = 0; i < rows; i++)
        for (j = 0; j < cols; j++)
                if (matrix[i][j] > 0) ...
のように使う。ただし, 単なる配列の配列なので, 行列の大きさ(rowsとcols) は別に覚えておく必要がある。
C++を使ってよければ, STLで vector<double>->size() とすればよいが, C言語でも 配列や行列のサイズは別に持たず, 自分で覚えていてほしい, という場面は 非常に多いと思う。 実際, STLでも使っているのはほとんど size() メソッドばかりな気がします。

一番簡単な解決策は, ベクトルの場合は

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->content[i]->content[j] とか matrix_val(mu, n, m) = matrix_val(nu, n + 1, matrix_val(c, i + n, j)); のような書き方がされていて, 個人的に非常に読みにくかったからでした。
上の dmatrix を使えばこれは mu[n][m] = nu[n+1][c[i+n][j]] と短く書くことができ ますが, 最初perlで文字列置換でやろうとしたところ, 再帰的に行うのが難しいことに気付きました。
少し考えて, cpp を使うことに。次のようなファイル replace.cpp
#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
のようなスクリプトを書くことで, 綺麗に変換することができました。


*1: ちなみに, 中身をまとめて1次元の配列として確保しても, うまく操作すると matrix[i][j] でアクセスできるという話を 2004年の日記 に書きましたが, これは上の配列の配列より遅くなります。
実際には配列の操作では比較的近い場所を続けてアクセスすることが多いので, 細かく分かれていた方がページフォルトが起こりにくい, というような理由もありそう です。
*2: これはポインタの操作を簡単にしているためにこうしているだけで, 本質的な問題ではありません。sizeof(double) * len + sizeof(int) を確保するように すれば, どんな場合でも原理的にokです。

2 days displayed.
タイトル一覧
カテゴリ分類
 なかのひと
Powered by hns-2.10-pl1, HyperNikkiSystem Project