引き続き配列の話です。この記事では二次元以上の配列を扱います。
テーブル・ブリック
J では二次元配列をテーブル (table)、三次元配列をブリック (brick: れんが) と呼びます。四次元以上の配列は、あまり使わないので別名はついていません。
特に数値のテーブルは、行列 (matrix) を表すのに使われます。
数値の多次元配列は、i. (monad) で簡単に作れます。
i.2 3 NB. 2 * 3 の行列
0 1 2
3 4 5
i.2 2 3 NB. 2 * (2 * 3) のブリック
0 1 2
3 4 5
6 7 8
9 10 11
上の結果を見ると、三次元以上の配列は空行で区切って表示されていることが分かります。
二次元配列が分かれば三次元以上も分かると思うので、二次元配列を例として使うことにします。
配列の形
# (monad) は配列の長さを求める verb でしたね。これをテーブルに使ってみましょう。
a=: i.2 3
#a
2
a には 6 個の要素がありますが、# は 2 を返しました。この理由は、a が 0 1 2 と 3 4 5 を要素とする配列とみなされるからです。# は配列の最初の次元の長さを返します。
配列は shape (形) と rank (階数) と呼ばれる性質を持っています。shape は、$ (monad) で調べられます。
$a
2 3
$ は、各次元の要素数をリストにして返します。これを使えば、全体の要素の個数 (ここでは 6) を求める式も書けますね 1。
rank は、配列の次元の数です。これは言い換えると、shape の要素数を意味します。
NB. #$ で rank を求める
#$a NB. テーブル
2
#$1 2 3 NB. リスト
1
#$1 NB. アトム
0
ちなみに、アトムの shape は空のリストです。
テーブルを作る
リストからテーブルを作る方法は、いくつか あります。その中でも よく使うものを紹介します。
$ (dyad)
$ を dyad として使うと、shape を指定して配列を作ることができます。
2 3 $ 5
5 5 5
5 5 5
2 3 $ 'abcdef'
abc
def
2 3 $ 0 1 NB. 要素数が足りない場合は繰り返される
0 1 0
1 0 1
,: (dyad)
,: は、リストを要素としてテーブルを作ります。
1 2 3 , 4 5 6
1 2 3 4 5 6
1 2 3 ,: 4 5 6
1 2 3
4 5 6
テーブルをリストにする
テーブルの要素を取り出してリストにするには、monad の , を使います。
,a
0 1 2 3
, の結果は常に一次元配列です。
行列
J では行列の演算もシンプルに書けます。ベクターと同様、+ 等は それぞれの要素に適用されます。
a=: i.2 2
a
0 1
2 3
NB. スカラー倍
2 * a
0 2
4 6
NB. 和
a + a
0 2
4 6
NB. 行列式
-/ .*a
_2
NB. 積
a +/ .* a
2 3
6 11
/ と . の間には空白が必要 2 なので注意してください。
. は conjunction (接続詞) です。conjunction は、引数 (被演算子) が 2 つである点を除いて、adverb と同じです。
(- /) . (*)
(+ /) . (*)
. は行列の計算以外で使うことは まず無いので、どう動いているかの説明は省きます。
ひとまずは、配列の話はここまでとします。
[ 前 : 文字と文字列 ] [ 目次 ] [ 次 : ボックス ]