Chapter One

第1話


やー
ナイジェルだ、よろしく。
大橋にスペースが余ってるって聞いたから、それじゃー何か書いてやる、って言ったのが発端だ。
リラックスして聞き流してもらいたいんだが、ラブビューのプログラミングで、最高に気分がいいのは配列の演算の時にFor..Nextをタラタラ書かなくても良い事だと思うが、どうだい。ところで、APLって知ってるか? はやんない言葉で、とっくに消えちまってると思ったが、この間、LAOXの本屋で参考書を見かけたから、まだやってるヤツがいたんだね。プログラムって言っても、見かけない記号のラレツで、俺には、なじめないと思ったが、なにしろマトリックスやベクトルが普通の数字みたいに計算できるのには、目からウロコ。そう思って比べてみるとラブビューは似ているファンクションがゴロゴロ出てくるからNIの開発者は勉強してるな、たぶん。
日本人は高い電話代払って見てるんだから、そろそろ本題に入るか。

Fig. 1


大橋が作った2D Sort.viの解説をするんだが、何だこの色使いは、最悪の出来だね、悪いけど。Array IN、Column、Sort Orderを入力してArray OUTに出力されるのは、分かりやすいが、サインまで貼ってあるぜ!何を考えてるんだか。

Fig. 2



ブロック図はシンプルだけどこれじゃー見にくいよな。基本的な流れだけこれで説明しておくと、Columnで指定された列を標準のSort 1D Arrayでソートして、ソート結果を見ながら順番に行を積み上げていく方法だな。まともなやり方じゃないが、ソートを標準で持っているラブビューならではだと、ヤツは自画自賛していたな。そう思う?

Forループの左、Forループ、Forループの右の3つに分けて説明するぜ。

Fig. 3



Forループの左側はループに入る前の準備だな。
上の方ではArray INと同じ大きさの配列を作ってシフトレジスタに突っ込んでいる。真ん中のColumnが入っているファンクションはIndex Arrayで、指定した要素を取り出すものだが、上の方の端子が白抜きになっていて行については指定無し(全て)なのでColumnで指定された列が出力される。
ところで、行と列を広辞苑で調べると「行」文字などの縦または横のならび、「列」つらなり、ならびとあるので、縦横がわからないじゃないか。英語の場合をcolumnとrowは研究社の英和辞典で調べると、「column」は柱や支柱や円柱、「row」は列やならびや(チェッカー盤の)横筋や(数表の)横行だからして、英語だったら迷わないぜ。
日本の数学では、横の並びを行、縦の並びを列と決めているらしいが、「行列」ではなくて「縦横」とか「平柱」だと、もっと覚えやすんだが。中国、台湾ではいったいどんな名前にしてんだろう。彼らのセンスにはしばしば感動させられるぜ。 、、脱線しちまった。
一番下では、抜き出した列と同じ大きさのブーリアンアレイを作っておく。これもForループのシフトレジスタに突っ込んでおく。

Fig. 4



コンセプトはシンプルだ。抜き出した列でインデキシングしながらループを回して、その要素が、ソートした列の何番目にあるかを調べる。何番目か分かったら、順番に取り出したオリジナルの2次元配列の行を、イニシャライズしておいた2次元配列の分かった番号の行に入れ込む。Do you follow me?
ソートした列の何番目にあるかを調べるのには、Search 1D Arrayを使ってる。これは便利だけど、やっかいなのは、0番目の要素から順に捜していって初めに見つけた要素番号を返してくる点だ。つまり、同じ数字が入っている列をソートするときに面倒が起きるんだ。ケースストラクチャとブーリアンアレイはソートした後、同じ数字が並んでいるときのためのチェックボックスだ。ソートした列の何番目にあるか分かったら、その番号のチェックボックスが使われていないかどうか調べる。Falseでイニシャライズしてるから、まだFalseだったら使われていない証拠だ。ケースストラクチャは下の図にあるFalseを通り、チェックボックスをTrueにする。
Trueだったらホワイルループで、Falseが出てくるまで繰り上げて、見つかった番号のチェックボックスをTrueにして、その番号を出力する。
結構、芸がコマカイぜ。

Fig. 5



ループから出たときには昇順に並んでるだろ。降順指定の時にはひっくり返さなきゃいけないぜ。なんでTranspose 2D Array を2個使っているかって?インデキシングしてForループの中に入れているから。インデキシングは、行でスライスしているの知ってたかい?

Fig. 6



これで、終わりだ。また気が向いたら書こうな。
Bye!


戻る