第4章 ベクトルと行列 駆け足で読む『離散数学〜コンピュータサイエンスの基礎数学』



本駆け足シリーズの全体の目次はこちら

  • ベクトル vector と行列 matrix と集合 set

データは添数付き集合の型に並べて扱われることが多い。添数付きデータ型は配列と呼ばれたり、1次元の配列と2次元、またはそれ以上の配列を区別して、ベクトル(1次元)、行列(2次元)、多次元行列と呼び分けたりする

  • ベクトル

n個の成分を持つリストu

すべての成分が0のベクトルを零ベクトル zero vector と呼ぶ。2つのベクトルがあり、要素数が等しく、対応する要素同士がすべて等しいとき、その2つのベクトルは等しい equal と言う, u=v

成分の個数が等しい2つのベクトルには和 sum が定義され、それはu+vと表さる。uvの各成分の和が和ベクトルの成分に等しい

ベクトルには2種類の積 product スカラー積とベクトル積が定義される。スカラー積とは、ベクトルの各成分にある値 をかけてできる値を成分としてもつベクトルである。ベクトル積には内積 dot product, inner product と外積 outer product がある。外積は行列になるので、後述することとする。内積は、成分数の等しいベクトル間に定義され、それは、対応する成分の積の和と定義される。その値はスカラーである。内積は、1行N列の行ベクトルとN行1列の列ベクトルの積、ともいえる。あるベクトルと自身との内積はゼロ以上であり、その平方根をノルム norm または長さ length と呼ぶ。ノルムがゼロのベクトルは零ベクトルである。

  • 行列

行列は、N行M列の矩形の数値配列である。行 row (縦) 列 column (横)で、M個の列ベクトルの並びともN個の行ベクトルの並びともみなせる。第i行j列の成分をij-成分 ij-entryと呼ぶ。

N行M列の行列について、NxMを行列のサイズ size と定義する。サイズの等しい2つの行列があって、そのすべての成分が等しいとき、その行列は等しい equal と言う。成分のすべてが零の行列は零行列 zero matrixと呼ばれる。

サイズの等しい行列には和が定義される。行列の和は、ij-成分の和を成分とする行列のことである。行列にはスカラー積も定義される。それは、各成分をスカラー倍したものである。特にスカラーとして-1をかけてできる行列を負行列 negative of matrix と呼ぶ

行列の積には行列積が定義される。NxP行列にPxM行列かける場合に定義される。

転置行列。NxM行列の転置行列はMxN行列である。ij-成分の値をji-成分の値としたもののことである

  • 正方行列
    • 列数と行数が等しい行列を特に正方行列と呼び、NxN行列の場合に、位数 N, order N からなると言われるとともに、N次正方行列 n-square matrix と読まれる。正方行列においては、ii-成分を特に、主対角成分 main diagonal, または簡単に 対角成分 diagonal と呼ぶ。
    • 正方行列の演算。スカラーは、1x1の正方行列であるとみなし、スカラーでの諸定義(和・べき・多項式)を正方行列に拡張することができる。スカラー 1 に相当するのは、単位行列 unit matrix I である。これは、主対角成分がすべて1でそれ以外の成分がすべて0であうような行列である。スカラー 0 に相当するのは零行列。スカラーの和は対応する行列成分同士の和を成分とする行列を作ることで、行列のべきは自身の行列の積とその回数で定義し、A^0=Iであるものとすることで、スカラーの0乗が1であることと対応させる。こうすることで、スカラーxに定義される多項式関数f(x)=a_0+a_1x+a_2x^2+¥cdots +a_nx^nを行列Aにあてはめ、f(A)=a_0+a_1A+a_2A^2+¥cdots +a_nA^nとする。スカラーxについてf(x)=0を満足するようなx多項式fの零点 zero または根 root と呼ぶが、これと同様に、f(A)=0を満足するような行列Aを多項式fの零点 根と呼ぶ
    • 正方行列の可逆性と正則。関数において可逆 invertible, inverseを定義した→こちら。行列も関係を表していることから、行列が表している関係が可逆か否かを定められる。関数の場合の可逆は1対1で上への関数である、つまり1対1対応である場合であり、そのような関数fを2回作用させるf¥circ fと元にもどる(f¥circ f = 1ことであるとも言えた。行列の可逆も同様に定義し、A A^{-1} = IのようなA^{-1}が存在するときAを可逆であると呼び、A^{-1}逆行列と呼ぶ。ただし、行列用語では"invertible"は可逆ではなく、正則と訳されるのが普通である
    • 正則(可逆)と行列式。行列には正則(可逆)なものとそうでないものとがある。正則(可逆)か否かは行列式 determinant と呼ばれるスカラー量が0でないことであることが知られている。n次元正則行列行列式は次式で与えられる。A=(a_{ij})に対して、¥det(A)=¥sum sgn(¥sigma) a_{1j_1}a_{2j_2}¥cdots a_{nj_n}、ただし、¥{1,2,¥cdots ,n¥}が作る順列¥sigma = j_1j_2¥cdots j_nのすべてについての和であり、符号sgn(¥sigma)は順列¥sigmaの数字を昇順に並べ替えるとき、数字の交換回数が偶数回ならプラス、奇数回ならマイナスとすることとする。なお、行列式は、乗法的¥det(AB)=¥det(A) ¥det(B)であることも知られている
  • プログラミング問題
    • データの格納はテンソルで行うことで拡張性・一般性を確保する。テンソルデータは後述(補足)の通り、総データ数が、¥prod_{i=1}^m n_iで、それが、階数の添字で表される。Tensorオブジェクトがもつべき情報は、(1) 階数 (スカラー)(2) 次数(階ごとに次数が変わる) (ベクトル(長さは階数)(3) データ(総データ数は上述の通り) (ベクトル、長さは総データ数) (4) 添字管理リスト(2次元リスト、データの通し番号と、それに対応する階数分の添字の値(ただし、(4)は冗長情報、つまりデータの通し番号から添字は算出可能であるし、添字の値のセットから通し番号は計算できる)
    • スカラー倍はテンソルの全要素のスカラー倍をする->ProdSchalarTensor
    • 同じ階数・同じ次数のテンソル同士には和があって、対応要素を足し合わせる->SumTensor
    • dot productは、同次数のベクトル同士に定義できて、スカラーが返る。これは関数テンソルになっている->DotProductTensor
      • t_{jk}=1¥times¥;a_j¥;b^k¥;¥; when¥; j=k
      • t_{jk}=0¥times¥;a_j¥;b^k¥;¥; when¥; j¥not=k
    • ベクトルの長さは、ベクトルとそれ自身との内積であるので、DotProductTensorを用いて計算できる->NormVector
    • 行列式はn次正方行列について定義される->DeterminantMatrix
      • det(A)=¥sum sgn(¥sigma)a_{1j_i}a_{2j_2}¥cdots a_{nj_n}->次数nについて、順列n!の項の和になる。個々の項は、1-nまでの昇順整列と順列から作られる整数のペアi,n_iについて、a_{in_i}をの積に、この順列のpermutation symbolをかけたものの和となっている
  • 2次正方行列の逆行列->Inverse2
    • 行列式の非ゼロをもって、逆行列の存否はわかる。2次正方行列については、算術的に逆行列を計算できる

public class Tensor {
int rank;

int[] dimension;

double[] data;
int[][] index;

public static void main(String[] args) {

//Create Tensor Object and print out its features
System.out.println("Tensor object is consisted of int rank, int[] dimension, double[] data" +
" and int[][] index");
int rank_ = 3;
int[] dim = {5,3,4};
int numdata_ = 1;
for(int i=0;i<rank_;i++){
numdata_*=dim[i];
}
double[] data_ = new double[numdata_];
for(int i=0;i<data_.length;i++){
data_[i]=i;
}

Tensor t = new Tensor(rank_,dim,data_);
PrintTensor(t,"\t","\n");

//Pick up element of tensor with indices
int[] s ={4,1,2};
System.out.println("Tensor t's elemen t_4,1,2 is");
PrintChoiceElem(t,s);

//schalar
System.out.println("\n