math.luma.dev
検索
/linear-algebra/basics/matrix

行列の定義

行列(matrix)

行列とは要素(element)を縦横に格子状に並べたもの、というのが素朴な定義。要素、行列とは一般にはなにか、という話が発展して議論されることになる。
それまでは、要素は特に断りがなければ実数(real)とする。一部、複素数(complex)とする場合もあるが、そのときは明記する。

行列の表記

A=(a0,0a0,1⋯a0,m−1a1,0a1,1⋯a1,m−1⋮⋮⋱⋮an−1,0an−1,1⋯an−1,m−1)←↑

括弧は丸括弧()ではなく角括弧[]が使われることもある。上記のような行列をn×mの 行列 と書く。

nは行(row)数、mは列(column)数と呼ぶ。

添字(index)(そえじ)は基本的に1から始める事が多いと思うが、このサイトでは0で始めることにする。

1×1の行列(a)は単なるaと表記する。これは、基本的に1×1の行列とスカラー(scalar)をしても、各種の性質が成立するからである。

A=(ai,j)とも書く。この表記は形式的な議論をする際に有用となる。また、i,jをデフォルトの添字用の変数(variable)とし、A=(ai,k)i,kなどのように特別に明示することにする。つまり、(ai,j)=(ai,j)i,j=(as,t)s,tとする。

今後は、A=(ai,j),B=(bi,j),A′=(ai,j′)などのアルファベットに対応するものを自然な定義として、特別の断りなしに用いる。

行列の例

2×2の行列

(1234)

3×2の行列

(0.100.2π0.30)

余談: 行列全体の集合(set)

このサイトでは、行列全体の集合をRn×mと書くことにする。
根拠としては、集合論(set theory)では自然数(natural)を0≔{},1≔{0}, 2≔{0,1},⋯というふうに集合論の言語に翻訳する技法があるのだが、これを利用していると考える。
まず、YXというのはf:X→Yなる写像(mapping)fすべてを表す集合として定義される。
これらの定義は冪集合(power set)の表記法のひとつである2S≔P(S)における2を{0,1}とみなした場合の整合性も取れている。
つまり、n×m={0,1,⋯ ,n−1}×{0,1,⋯ ,m−1}ということになり、添字(i,j)∈n×mからRへの写像が行列ということだ。

なお、他にもMn,m(R)と書くような流儀もある。

こうすると、0×0の行列も考えられる。これはつまり、何も入っていない行列のみがある、ということだ。R0×0={∅}(何も写さない写像のみを含む集合)ということになる。

スカラー

各要素単体を、行列と区別してスカラーと呼ぶ。
今後、行列同士の演算(operation)や、行列とスカラーの演算が定義されることになる。

ベクトル(vector)

ベクトルはスカラー値の有限列(finite sequence)である。以下のように表記する。

v=(v0v1⋮vn−1)

nのことをサイズと呼ぶことにする。

n×1の行列を列ベクトル(column vector)、1×nの行列を行ベクトル(row vector)と呼ぶ。

これ以降、ベクトルと列ベクトルとを同一視(identify)する。

また、n×mの行列をサイズnのベクトルm個を用いて以下のようにも記述する。

A=(v0v1⋯vm−1)

ベクトルの例

v=(1234) e2=(0010)

行ベクトルの例

e1′=(0100)

行と列の覚え方

行と列は以下のような暗記法がよく紹介される。

行列RowColumn

添字の順番の覚え方

ai,jのiやjのことを添字と呼ぶ。

覚え方1. 座標系の軸に対応させてYXと覚える

一般的な二次元(dimension)のデカルト座標系の軸は、おそらく横方向にx,縦方向にyが取られることが多いと思われる。それを基準に、y,xの順にインデックスを指定する、と覚える。

覚え方2. プログラムの二次元配列(array)と対応させて覚える

後述の行列の定義にある、二次元の配列に対応させ、そのインデックス指定順と同一であると考える。

プログラムにおける行列

プログラムにおいては、しばしば二次元の配列で表現される。

Python

a = [[0 for j in range(3)] for i in range(3)]
print(a)
[
[0, 0, 0],
[0, 0, 0],
[0, 0, 0]
]

Rust

fn main() {
let a: Vec<Vec<i32>> = (0..3)
.into_iter()
.map(|_| (0..3).map(|_| 0).collect())
.collect();
println!("{:?}", a)
}
[
[0, 0, 0],
[0, 0, 0],
[0, 0, 0]
]

余談: 一般化に備えて

前述の通り、要素などの代数的構造(algebraic structure)が何なのか、という話はのちに一般化される。基本的には実数 R や複素数 C として議論するが、すべて、体(field)(たい)としての性質のみを用いることに着目するとよい。つまり、体 Kに一般化されることになる。

以下に、体の公理(axiom)を予備知識の必要ない簡単な形式で書く。

集合Kと二項演算 (加算(addition))⋅+⋅:K×K→K,(乗算(multiplication))⋅×⋅:K×K→Kの組(tuple)(K,+,×)であって、

  1. 加算の単位元(identity)0の存在: ∃ 0 [0+a=a+0=a]
  2. 加算の逆元(inverse)の存在: ∃ b∈K [a+b=0∧b+a=0]
    このようなbは他の公理により一意に存在することがわかる。それを −a と表記する。
  3. 加算の交換律: a+b=b+a
  4. 加算の結合律: a+(b+c)=(a+b)+c
  5. 乗算の単位元1の存在: ∃ 1 [1×a=a×1=a]
  6. 乗算の逆元の存在: a∈(K∖{0})について、∃ b∈K [a×b=1∧b×a=1]
    このようなbは他の公理により一意に存在することがわかる。それをa−1と表記する。
  7. 乗算の交換律: a×b=b×a
  8. 乗算の結合律: a×(b×c)=(a×b)×c
  9. 加算と乗算の分配律: a(b+c)=ab+ac

なお、乗算の演算は省略することがある。

これからの議論が上記の性質しか使っていないと確認できることが重要。
例えば、実数特有の性質は使わないということだ。さらに具体的には、例えば以下のようなことが守られるということ。

  1. 有理数(rational)と無理数(irrational)で場合分けするといったことをしない。
  2. 2.2などの0,1以外の特殊な値を定義に使用しない。

行列はさらにその後、線形空間(linear space)を対象(object)として一般化される。そして、定義のいくつかの部分は無限(infinite)へと拡張される。