行列と魔方陣
行列について
MATLAB® 環境において、行列は数字を使った方形配列です。1 行 1 列の行列 (スカラー) と、列または行が 1 つしかない行列 (ベクトル) は、特別な意味をもつ場合があります。MATLAB では数値データおよび非数値データを格納する他の方法も提供していますが、最初はすべてを行列として考えたほうがよいでしょう。MATLAB の中の演算は、できるだけ自然であるように作られています。他のプログラミング言語が、一度に数値一つに機能する部分で、MATLAB は迅速、かつ簡単に行列全体に働きます。この本を通して使われている良い例としての行列は、ドイツの芸術家でアマチュアの数学者であるアルブレヒト・デューラーによるルネッサンス銅版画である Melencolia I に現われているものです。
このイメージは数学的なシンボルで満たされています。そして、注意深く見ると、上の右隅に行列が見えます。この行列は、魔方陣として知られているもので、デューラーの時代に本当に魔法的な性質をもっていると多くの人に信じられていたものです。これは、表現に値するいくつかの素晴らしい機能をもっています。
行列の入力
MATLAB をはじめるにあたり、行列の取り扱いについて学ぶことからはじめるのが最もよいでしょう。MATLAB を起動し、それぞれの例を順に試みてください。
MATLAB に行列を定義する方法は、たくさんあります。
明示的に要素のリストを入力
外部データ ファイルから行列を読み込む
組み込み関数を使って行列を作成
ユーザー独自の関数を使って行列を作成し、ファイルに保存
デューラーの行列を要素ごとに入力することから始めましょう。これを行うには、2、3 の基本的な規則に従うだけです。
空白、またはコンマを使って、行の要素を分離
セミコロン
;
を使って、行の終わりを設定要素全体を大かっこ
[ ]
で囲む
デューラー行列を入力するには、コマンド ウィンドウに単に次のように入力してください。
A = [16 3 2 13; 5 10 11 8; 9 6 7 12; 4 15 14 1]
MATLABは、入力された行列を次のように表現します。
A = 16 3 2 13 5 10 11 8 9 6 7 12 4 15 14 1
これは、銅版画の中の数字と一致しています。行列を一度入力すると、MATLABのワークスペースに自動的に記憶されます。この行列を単に A
として参照できます。さて、ワークスペース内に A
を定義したので、見てみましょう。なぜ、魔法なのか
和、転置、対角
魔方陣行列の特別な性質、すなわち、各要素の種々の和に関していることは、多分ご存知でしょう。行または列に沿って、または二つの主対角に沿って和を計算すると、同じ数字 (結果) を得るでしょう。MATLAB を使って確かめて見ましょう。まず、次のステートメントを試します。
sum(A)
MATLAB は、次の結果を表示します。
ans = 34 34 34 34
出力引数を設定しないと、MATLAB は変数 ans
(answer を省略) を用いて計算結果を格納します。これにより、A
の各列の和を要素とする行ベクトルを計算すると、列のおのおのの要素はすべて同じ、すなわち "魔方陣" の和は 34 です。
行の和はどうでしょう。MATLAB では、行列の列に関しての処理が優先されます。したがって、行の和を得る方法の 1 つは、行列を転置し、転置した列の和を計算して、その結果を再度転置することです。
MATLAB には 2 つの転置演算があります。アポストロフィ演算子 (例: A'
) は複素共役転置を実行します。これは主対角に対して行列を入れ替え、行列の複素数成分の虚数要素の符号を変更します。ドットアポストロフィ演算子 (A.'
) は複素数要素の符号を変えずに転置を実行します。すべての要素が実数の行列では、これら 2 つの演算子の処理は同じになります。
したがって
A'
は、以下の結果を出力します。
ans = 16 5 9 4 3 10 6 15 2 11 7 14 13 8 12 1
および
sum(A')'
は、行方向の和を含んだ列ベクトルを出力します。
ans = 34 34 34 34
2 回の転置を行わずに行を合計する他の方法として、関数 sum
に対して次元の引数を使用します。
sum(A,2)
は、以下の結果を出力します。
ans = 34 34 34 34
主対角要素の和は、関数 sum
と diag
を使って得られます。
diag(A)
は、以下の結果を出力します。
ans = 16 10 7 1
および
sum(diag(A))
は、以下の結果を出力します。
ans = 34
他の対角部、すなわち "逆対角" は、数学的にはあまり重要ではありません。そのため MATLAB にはそれに対応するような関数はありません。しかしグラフィックスの中で使われる関数 fliplr
は、行列の左から右への順番を逆にします。
sum(diag(fliplr(A))) ans = 34
これでデューラーの銅版画の中の行列は、本当に魔方陣であることが確認されました。そして、この過程には、2、3 の MATLAB の行列演算をサンプルとして示しています。次の節では、MATLAB の他の機能を示すためにこの行列を使います。
関数 magic
MATLAB は、任意のサイズの魔方陣を作る組み込み関数を用意しています。当然ながら、この関数名は magic
です。
B = magic(4) B = 16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1
この行列は、デューラーの銅版画の中のものとほぼ同じで、同様な「魔方陣」の性質をもっています。ただし、中央の列が入れ替わっていることが異なります。
B
の中央の 2 列を入れ替えてデューラーの A
のようにすることができます。B
の各行を、1、3、2、4 で指定された順序で列を並べ替えます。
A = B(:,[1 3 2 4])
A = 16 3 2 13 5 10 11 8 9 6 7 12 4 15 14 1
行列の作成
MATLAB は、基本的な行列を作成する 4 つの関数を用意しています。
以下にいくつかの例を示します。
Z = zeros(2,4) Z = 0 0 0 0 0 0 0 0 F = 5*ones(3,3) F = 5 5 5 5 5 5 5 5 5 N = fix(10*rand(1,10)) N = 9 2 6 4 8 7 4 0 8 4 R = randn(4,4) R = 0.6353 0.0860 -0.3210 -1.2316 -0.6014 -2.0046 1.2366 1.0556 0.5512 -0.4931 -0.6313 -0.1132 -1.0998 0.4620 -2.3252 0.3792