ブログの説明

学校に通わないで学んだことを記しています。間違っているところが何かありましたらご指摘下さると幸いです。コメントに対する返信が遅れる可能性があります。その場合は申し訳ありません。

このブログではサイドバーに広告を表示しています。このブログ内の投稿記事を検索するには右上の拡大鏡のアイコンを、アーカイブやラベル付けから投稿記事を閲覧するには左上の三重線のアイコンをクリックして下さい。

数式の表示にはMathJaxを利用させていただいています。数式の表示のためにJavaScriptが有効である必要があります。そうでない場合、訳の分からないLatexのコードが表示されます。幾何学図形やチャートの表示にはHTML5 CanvasやGoogle Chartを使用しています。その表示のためにもJavaScriptが有効である必要があります。

数学の行列とその情報処理の初歩ノート

行列とは何か

数学でいう行列はその名のとおり行と列からなる数値の並び。英語ではmatrix(複数形はmatrices)と称されている。行は英語でrowと呼ばれ、列は英語でcolumnと呼ばれている。ちなみに行が横方向の並びを指し、列が縦方向の並びを指している。行は上から順番に第1行、第2行、第3行というふうに称され、列は左から順番に第1列、第2列、第3列というふうに称されている。それらを構成している個々の数値はその行列の成分または要素と呼ばれている。

\[ \begin{pmatrix} a_{11} & a_{12} & a_{13} & \cdots & a_{1n} \\ a_{21} & a_{22} & a_{23} & \cdots & a_{2n} \\ a_{31} & a_{32} & a_{33} & \cdots & a_{3n} \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ a_{m1} & a_{m2} & a_{m3} & \cdots & a_{mn} \end{pmatrix} \]

行列の型とは

個々の行列は行数x列数のようにその行数と列数によって識別される。それらは行列のサイズ(size)とか行列の次数(order)と呼ばれている。日本語の数学書では行列の型と呼ばれていることが多い。たとえば3行と5列の要素から成る行列は、3x5行列とか3x5型行列などと書き表される。横方向の並びである行数、縦方向の並びである列数の順番であることに要注意。真ん中のxは掛ける(times)ではなくbyであり、3x2ならthree by twoと読まれている。数学では行をmで列をnで表す慣例がある。

4x3行列
5.2 2.8 7.0
7.6 1.9 2.2
4.6 8.1 3.0
6.4 8.3 0.5

数学の流儀だと\[ \begin{bmatrix} 5.2 & 2.8 & 7.0 \\ 7.6 & 1.9 & 2.2 \\ 4.6 & 8.1 & 3.0 \\ 6.4 & 8.3 & 0.5 \end{bmatrix} \]のように丸括弧や角括弧でくくって表される。角括弧を使う場合、Latexでは要素を\begin{bmatrix}...\end{bmatrix}で挟めばいい。

正方行列とは

行数と列数が等しい行列は特に正方行列(square matrix)と呼ばれている。2x2行列は2次の正方行列(square matrix of order 2)。

2x2行列
a + b 2a
3b a - b

数学の流儀だと\[ \begin{pmatrix} a + b & 2a \\ 3b & a - b \end{pmatrix} \]のように丸括弧や角括弧でくくって表される。丸括弧を使う場合、Latexでは要素を\begin{pmatrix}...\end{pmatrix}で挟めばいい。

行ベクトルと列ベクトル

次の行列のように、1行だけから成る行列は行ベクトル(row vertor)、1列だけから成る行列は列ベクトル(column vector)と呼ばれている。

1x3行列は3次の行ベクトルと呼ばれている。

1x3行列
-2 6 10

数学の流儀では\[ \begin{pmatrix} -2 & 6 & 10 \end{pmatrix} \]と表される。

3x1行列は3次の列ベクトルと呼ばれている。

3x1行列
2a
b
3c

数学の流儀では\[ \begin{pmatrix} 2a \\ b \\ 3c \end{pmatrix} \]と表される。

零行列とは

行列のすべての成分が0である行列は零行列(zero matrix)と呼ばれていてローマ字のOで表される。

零行列O
0 0 0
0 0 0
0 0 0
\[ O = \begin{pmatrix}0 & 0 & 0 \\ 0 & 0 & 0 \end{pmatrix} \]

単位行列とは

正方行列の一種でありかつ、左上から右下へ対角線状に1が並び、他のすべての要素が0である行列は、特に単位行列(identity matrix)と呼ばれている。日本ではローマ字のEで書き表されたりするが英語圏ではidentityの頭文字Iで書き表される。1が2つの場合は2次の単位行列、1が3つ場合は3次の単位行列と呼ばれている。数学の流儀では次数をEまたはIの右下に小さく添える。\( E_n \)または\( I_n \)。

2次の単位行列\( I_2 \)
1 0
0 1
\[ I_2 = \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix} \]
3次の単位行列\( I_3 \)
1 0 0
0 1 0
0 0 1
\[ I_3 = \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix} \]

行列同士が等しいとは

行数x列数が共に等しい2つの行列があった場合、それら2つの行列は互いに同じサイズの行列だと呼ばれている。同じサイズでかつその中の要素まで同じ値と同じ配置を持っている行列は互いに等しい行列であると定義されている。

A
5 2 7
3 9 12
B
10 - 5 1 + 1 3 + 4
2 + 1 10 - 1 10 + 2

これらのAの行列とBの行列とは共に2x3行列でかつその成分の値とその配置までが同じなので相等しいと言える。A = Bと記される。

\[ A = \begin{pmatrix} 5 & 2 & 7 \\ 3 & 9 & 12 \end{pmatrix} \] \[ B = \begin{bmatrix} 10 - 5 & 1 + 1 & 3 + 4 \\ 2 + 1 & 10 - 1 & 10 + 2 \end{bmatrix} \] \[ A = B \]

転置とは

次のような行列Aと行列Bとがあったとする。

行列A
はい 40% 53%
いいえ 55% 35%
無回答 5% 12%
\[ A = \begin{bmatrix} 0.4 & 0.53 \\ 0.55 & 0.35 \\ 0.05 & 0.12 \end{bmatrix} \]
行列B
はい いいえ 無回答
40% 55% 5%
53% 35% 12%
\[ B = \begin{bmatrix} 0.4 & 0.55 & 0.05 \\ 0.53 & 0.35 & 0.12 \end{bmatrix} \] \[ A = B^{tr} \]

この行列Bは行列Aに対して転置行列であるとされる。一般に、行列の列を行に置き換えて行を列に置き換えることは転置(transpose)と呼ばれている。行列Aに対して行列Bが転置行列であることは\( A = ^{t}B \)または\( A = B^t \)もしくは\( A = B^{tr} \)と書き表される。添字のtは大文字Tでも書き表されることがある。

\[ \begin{pmatrix} 1 & 2 \\ 3 & 4 \end{pmatrix} = \begin{pmatrix} 1 & 3 \\ 2 & 4 \end{pmatrix}^{tr} \]

Pythonで行列

Python3.4.2で行列を作るには、numpyをインポートしてそのmatrix関数を使う。次のコードでは、3x2行列を作って変数Aに代入し、2x3行列を作って変数Bに代入している。npとしてnumpyをインポートしてからmatrix関数の引数に行列の成分を渡している。

$ python3
>>> import numpy as np
>>> a = np.matrix('1,2; 3,4; 5,6')
>>> a
matrix([[1, 2],
        [3, 4],
        [5, 6]])
>>> b = np.matrix('1,2,3; 4,5,6')
>>> b
matrix([[1, 2, 3],
        [4, 5, 6]])
>>> exit()

単位行列を作るにはnumpy.identity関数を使い、第引数に1の数、dtype=としてデータ型を指定すればいい。データ型のデフォルト値はfloatなので、ここではintを指定した。

>>> import numpy as np
>>> np.identity(3, dtype=int)
array([[1, 0, 0],
       [0, 1, 0],
       [0, 0, 1]])

Rで行列

R言語3.1.1で行列を作るにはmatrix関数を使う。matrix関数の第1引数に成分の値を、第2引数に行数を、第3引数に列数を指定する。次のコードでは、3x2行列を作って変数Aに代入し、2x3行列を作って変数Bに代入している。c関数で1から6までの数列を生成している。byrow=Tを指定することで行から成分を埋めていくことができる。nrow=としても行数を、ncol=としても列数を指定できる。その場合には引数の順序を問わない。

$ R
> a <- matrix(c(1:6), 3, 2, byrow=T)
> a
     [,1] [,2]
[1,]    1    2
[2,]    3    4
[3,]    5    6
> b <- matrix(c(1:6), 2, 3, byrow=T)
> b
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
> q()

単位行列を作るにはdiag関数を使い、引数に成分1の数を指定する。

> a <- diag(3)
> a
     [,1] [,2] [,3]
[1,]    1    0    0
[2,]    0    1    0
[3,]    0    0    1

Rubyで行列

Ruby2.1.5で行列を作るにはmatrixクラスをrequireメソッドで取り込んだ上でMatrixメソッドを使う。ここでは対話型のirb上で試してみた。次のコードでは、3x2行列を作って変数Aに代入し、2x3行列を作って変数Bに代入している。

$ irb
> require 'matrix'
=> true
> a = Matrix[[1,2],[3,4],[5,6]]
=> Matrix[[1, 2], [3, 4], [5, 6]]
> b = Matrix[[1,2,3],[4,5,6]]
=> Matrix[[1, 2, 3], [4, 5, 6]]
> exit

単位行列を作るにはMatrix.identityメソッドを使う。引数に成分1の数を指定。

> require 'matrix'
=> true
> c = Matrix.identity(3)
=> Matrix[[1, 0, 0], [0, 1, 0], [0, 0, 1]]

Maximaで行列

Maxima5.34.1で行列を作るにはmatrix関数を使う。次のコードでは、3x2行列を作って変数Aに代入し、2x3行列を作って変数Bに代入している。Maximaでは文の終わりに;が必要。

$ maxima
Maxima 5.42.1 http://maxima.sourceforge.net
(中略)
(%i1) A:matrix([1,2],[3,4],[5,6]);
                                   [ 1  2 ]
                                   [      ]
(%o1)                              [ 3  4 ]
                                   [      ]
                                   [ 5  6 ]
(%i2) B:matrix([1,2,3],[4,5,6]);
                                  [ 1  2  3 ]
(%o2)                             [         ]
                                  [ 4  5  6 ]

単位行列を作るにはident関数を使う。引数に成分1の数を指定。他にdiagmatrix関数を使えば1以外の成分を対角線状に並べることもできる。

(%i3) C:ident(3);
                                  [ 1  0  0 ]
                                  [         ]
(%o3)                             [ 0  1  0 ]
                                  [         ]
                                  [ 0  0  1 ]
(%i4) D:diagmatrix(3,2);
                                  [ 2  0  0 ]
                                  [         ]
(%o4)                             [ 0  2  0 ]
                                  [         ]
                                  [ 0  0  2 ]
(%i5) quit();

Free Pascalで行列

Free Pascal2.6.4で行列を作るには2次元配列を使う。var 配列名:array [1..n, 1..m] of データ型、という形式で2次元配列を宣言する。そして各配列要素に値を代入すればいい。

例えば次のコードでは、整数型の値を入れる3x2の2次元配列を作って変数Aに代入し、forループで配列の要素に値を1から順番に代入して最後にその2次元配列の要素を表示している。

program matrix1;
const row_size=3; col_size=2;
var matrixA:array[1..row_size, 1..col_size] of integer;
var row,col,element:integer;
begin
   element:=1;
   for row:=1 to row_size do
      for col:=1 to col_size do
      begin
         matrixA[row,col]:=element;
         element:=element+1;
      end;
   for row:=1 to row_size do
   begin
      for col:=1 to col_size do
         write(matrixA[row,col], #9);
      writeln
   end
end.

実行結果は次のようになる。

$ ./matrix1
1       2
3       4
5       6

2次元配列を宣言した直後にその成分を指定したコードの例。

program matrix2;
const row_size=3; col_size=2;
var A:array[1..row_size, 1..col_size] of integer = (
   (-2,3),
   (5,8),
   (-8,6)
);
var row,col:integer;
begin
   for row:=1 to row_size do
   begin
      for col:=1 to col_size do
         write(A[row,col], #9);
      writeln
   end
end.

実行結果は次のとおり。

$ ./matrix2
-2      3
5       8
-8      6

C言語で行列

次のコードは3x2行列をC言語の2次元配列で実現して表示するもの。

/*
 * 行列のための2次元配列
 * gcc -lm array1.c -o array1
*/
#include <stdio.h>

#define M 3 // 行数
#define N 2 // 列数

int main(void)
{
 int a[M][N] = {{-2, 3},{5,8},{-8,6}};

 printf("%d %d\n", a[0][0], a[0][1]);
 printf("%d %d\n", a[1][0], a[1][1]);
 printf("%d %d\n", a[2][0], a[2][1]);

 return 0;
}

実行結果は次のとおり。

$ ./array1
-2      3
5       8
-8      6

次のコードは同じことをfor文を使って実現したもの。

/*
 * 行列のための2次元配列
 * gcc -lm array2.c -o array2
*/
#include <stdio.h>

#define M 3 // 行数
#define N 2 // 列数

int main(void)
{
 int i,j;
 int a[M][N] = {{-2, 3},{5,8},{-8,6}};

 for(i=0; i<M; i++)
 {
  for(j=0; j<N; j++)
  {
   printf("%d ", a[i][j]);
  }
  printf("\n");
 }
 return 0;
}

実行結果は次のとおり。

$ ./array2
-2      3
5       8
-8      6

まとめ

行列
数や文字や式を縦方向と横方向とに交差するように碁盤目状に整然と並べたもの。数学の流儀では通常、丸括弧や角括弧でその全体を挟んで書き表される。英語ではmatrixと呼ばれ、spreadsheetの類義語。
行列の成分・要素
行列を構成するおのおのの数や文字や式はその行列の成分または要素と呼ばれている。英語ではelement.
行列の成分の横方向の並び。上から順番に第1行、第2行、第3行…というように呼ばれている。英語ではrow.
行列の成分の縦方向の並び。左から順番に第1列、第2列、第3列…というように呼ばれている。英語ではcolumn.
行列の型・次数
個々の行列は行数x列数のように書き表され、行列の型、または行列の次数などと呼ばれている。英語ではsizeまたはorder. 2行と3列から成る行列は、2x3行列、または2x3型行列などと書く。xは英語ではbyと読む。ただし、英語で行列の型、すなわちtypes of matricesと言えば、正方行列や単位行列や零行列など、行列の種類のことを指す。
正方行列
2x2行列や3x3行列や4x4行列のように、行数と列数とが同じ行列は正方行列と呼ばれている。英語ではsquare matrix. 2x2は2次の正方行列、3x3は3次の正方行列とも呼ばれることがある。英語ではそれぞれ、square matrix of order 2, square matrix of order 3.
行ベクトル
1x3行列のように、1つの行だけから成る行列は行ベクトルと呼ばれている。英語ではrow vertor. 1x3行列は3次の行ベクトル、1x5は5次の行ベクトルと言う。
列ベクトル
3x1行列のように、1つの列だけから成る行列は列ベクトルと呼ばれている。英語ではcolumn vertor. 3x1行列は3次の列ベクトル、5x1は5次の列ベクトルと言う。
零行列
行列の成分がすべて0になっている行列。ゼロ行列とも言う。ローマ字の大文字Oで書き表されることがある。英語ではzero matrixかnull matrix.
単位行列
正方行列であり、かつ、行列の成分として左上から右下にかけて対角線状に1が並び、その他の成分が0の行列。ローマ字の大文字IまたはEを使い、1の数を次数として\( I_3 \)または\( E_3 \)のように書き表される。英語ではidentity matrixまたはunit matrix.
行列の相等
行列の型とその成分の値と配置がすべて同じ行列同士は互いに等しい行列だと定義されている。=演算子で繋げて書き表される。
転置
列の成分を行の成分に置き換え、行の成分を列の成分に置き換えることは転置と呼ばれている。英語ではtranspose. 転置された行列は右上か左上に小さなtかtrかTを添えて書き表される。
Python(3.4.2)で行列
numpyをインポートしてnumpy.matrix関数を使う。numpy.matrix('第1行の成分; 第2行の成分; ...')のように成分を,で区切って行を;で区切って指定する。単位行列を作るにはnumpy.identity関数を使う。第1引数に成分となる1の数、dtype=としてデータ型を指定できる。データ型のデフォルト値はfloat.
R言語(3.1.1)で行列
matrix関数を使う。第1引数に行列の成分を行ベクトルとして与え、第2引数に行数、第3引数に列数を指定する。byrow=Tを指定するかしないかで引数に与えた成分の並べ方が変わる。行数はnrow=, 列数はncol=としても指定できる。単位行列を作るにはdiag関数を使う。
Ruby(2.1.5)で行列
require 'matrix'した上でMatrixメソッドを使ってその引数に行列の要素を与える。単位行列を作るにはMatrix.identityメソッドを使う。
Maxima(5.34.1)で行列
matrix関数を使ってその引数に行列の要素を与える。単位行列を作るにはident関数かdiagmatrix関数を使う。
Free Pascal(2.6.4)かC言語で行列
いずれも2次元配列を使う。

R言語の公式ホームページ
https://www.r-project.org/

関連投稿

コメント

このブログの人気の投稿

Visual Studio 2019にはC++のためのフォームデザイナーがない件

10の補数と9の補数と2の補数と1の補数

LATEXで数式:指数と順列などで使う添数・添字