行列演算、ファイルコピー、次元 (2008/05/11)


2008/05/09

コンピュータの事といっても最近はいわゆる「計算機」としてしか使っていない上に、 計算の内容も私しか興味の無いような事ばかりなので、 もう、ここにはコンピュータの事だけを書くのはやめにして、 主に技術的な事を書く事にするよ。

技術的なというのは主に、明らかな数理的に定義可能な目標があり、 それを達成するための手口一般というほどの意味です。 それよりも一歩以前の、目標をさぐっていくところがいうまでもなく一番おもしろいところですが、 そういう事に興味を持つ人ばかりではないし、 案外、記事として役に立つのは、こういう目標のはっきりしたもののほうですからね。

とはいえ、そういう事は既にちゃんと解決されているものがほとんどですから、 あまりみんなの役に立つようなネタがあるとも思えないのですが。

行列演算

octave というプログラムがあって、 何かというと、理系一般で要求されるような数値演算をやってくれる、 インタプリタです。

ご多分に洩れず、行列演算もできます。

Ruby には Matrix クラスというのがオマケでついていますが、 ぱっと見たところ必要な機能が付いてない感じだったので、 何か便利なものは無いかな、とさがしていたところ、 馬場さんの Google の Page ランクの記事をみかけ、そこで Octave が使われていたので、 じゃあ俺もそれにしてみるか、というくらいの感じで使い始めました。

行列のかけざんとかは、自分で Array の拡張として実装し、 固有値計算だけ Octave に投げています。 やりかたは馬場さんの記事と同じで、 計算すべきデータから、 Octave のコードを生成し、それを Octave インタプリタに評価してもらい、 結果をもらってそれを Ruby のデータに解釈する、というものです。 とはいえ、固有値計算にもいろんな方法があるわけですが、 よくわからないのでとりあえずいまのところは組み込みの eig 関数をそのまま使っています。ぎゃはは。

行列のサイズですが、1000x1000くらいなら最近のノーパソでも余裕で動きますな。

本当はもっと大きなサイズで計算しなきゃいけないのですが、 そのまえにいろいろと考えなきゃいけない事も多いので、 実際に手が動くまえに止まってしまって2週間くらい経ちました。 さて、今後はどうなるのでしょうかね。

ファイルのコピー

tar cvfz - -C /path/to/src srcdir  | ssh user@host.example.jp 'tar -xvfz - -C /path/to/dst'

手もとのファイルをリモホにコピーするのは上のとおりですが、 リモートのファイルを手もとに持って来るにはどうすればいいかというと、

ssh oresama@dokoka.no.host 'tar cvfz - /path/of/src/' | tar xpfz - -C / 

こんな感じです。

この仕組みは、リモートにコマンドとして tar を投げるわけですが、 そのオプションに「標準出力にアーカイブを出す」というのが付いています。 ところでその標準出力はどこにつながっているのかというと、 ssh を通して手もとの標準出力につながっているわけです。 そこで、その標準出力を手もとの tar にパイプで流し込んでやれば、 リモートで生成したアーカイブデータが手元にやってきて、展開される。

結果としてファイルが全部まとめて、 オーナや修正日時なんかも含めてそのままコピーされることになるわけです。

標準入出力ってすごいですね。誰が発明したんだ? Ken Thompson か? 私はとにかくこういうのをみると、unix以外ありえねーと激しく思うわけですが、 皆さんはそんなことないですか。そうですか。

一般的に、ファイル転送においてはCPUよりもネットワークがきついので、 これを軽減するためにファイルを圧縮/解凍しながら送ることで、 CPUでネットワークの負荷を代替できるところもいいですね。 もっとも、SSH にもそのためのオプションはあったような気もしますが。

次元

おめーとは次元が違うんだよ、とかいうはなしがありますが、ありませんか。そうですか。

次元って何だよ。って最近思う私がここに居るわけです。

次元には用途というか対象とする空間(集合って言ってしまうといかにも役に立ちそうもないので、 なんか役に立ちそうなニュアンスをにおわせる時の名称ですね)によっていろいろあって、 それぞれおもしろい。

出発点は、R**3 とか R**2 とか(** はべきです。つまり 右上にちっこく書いてある数だとおもってくれ)のユークリッド空間の次元です。

この場合は、極大な正規直交系の要素の数がその空間の次元ですな。 3次元空間というのは、3本の直交する基底 すなわち x y z の3次元があってですね。 z はzバッファのz ですよ。 重要なのは、次の二つすなわち、この3本を使えば3次元ユークリッド空間で行けないところはなく、 かつ、一本でも欠ければ行けないところが出て来る、ってやつです。 x、y の2本だけでも正規直交系ですが、 z 方向が無いと3Dにはなりませんな。 また、3本で十分なところにもう一本追加しても無駄です。

この手の空間は一般にベクトル空間といいまして、基底の数を空間の特徴量として使う事ができます。

これを抽象化したものが Lebesgue covering dimension です。(以下 LCD) 通称、 Topological dimension とも呼ばれ、詳しくは専門の文献を参照してもらうとして、 簡単に書くと、任意の被覆について、その refine をとると全ての点がたかだか m +1 個の 開集合に含まれるときその空間のLCD を m とします。 被覆の refine とは、被覆である集合族{Ci} に対して {Di} もまた同じ空間の被覆になっており、かつ、 全ての{Di}の要素は{Ci}の要素の部分集合になっているような、 そういう {Di} をいいます。 演習問題としては、こんなのどうすかね。

16次完全グラフK16を R**15 に埋めこんだ図形がある。 そのLCD を求めよ。

基底の数も LCDも自然数ですな。次元といえば自然数。それ以外はありえない。 そんなふうに考えていた頃が、俺にもありました。


記事リストへ