[数学] 線形代数 第2回: 行列と行列演算: 基本的な演算と応用

1. 行列とは

行列は、数字を表形式(縦と横に並べた形)で並べたものです。普段、数式や計算をする時に使う「数」を、便利に管理できる方法として行列があります。行列は、特に変換や連立方程式の解を扱うときに非常に役立ちます。

行列の使い道:

  • 変換:物体や点を、回転させたり、拡大・縮小したり、移動させたりするために使われます。たとえば、2Dや3Dの座標を回転させたり、拡大したり、平行移動する時に行列が活躍します。

  • 連立方程式の解:複数の方程式を同時に解くために行列を使うことができます。これによって、複雑な計算も簡単に解けるようになります。

行列の形:

行列は、数字を行(横)と列(縦)に並べた形です。例えば、次のような形です:

A = [ a  b ]
    [ c  d ]

これは「2x2行列」と呼ばれるもので、2行(横の列)と2列(縦の行)が並んでいます。それぞれの位置に数字が入っています。これを「行列の要素」と呼びます。

  • a, b, c, d は行列の要素です。
  • 最初の数字(行列の左上)から順番に、行(横の列)と列(縦の行)がどこにあるかを表しています。

行列のサイズ:

  • 行列は「行数 x 列数」でその大きさが決まります。

  • 例えば、2x2行列は「2行2列」の行列です。

    • 例:2行2列(2x2) → [ a b ][ c d ]
    • 例:3行3列(3x3) → [ a b c ][ d e f ][ g h i ]

行列の要素は、特定の規則に従って計算や変換に使われます。

2. 行列の加法とスカラー倍

1. 行列の加法

行列の加法は、同じサイズの行列同士でのみ行うことができます。加算方法はとてもシンプルで、対応する位置にある要素同士を加算します。

例えば、2つの行列が次のようになっているとします:

A = [ 1  2 ]
    [ 3  4 ]

B = [ 5  6 ]
    [ 7  8 ]

行列Aと行列Bを加算する場合、それぞれ対応する要素を足し算します:

  • (1行1列の要素) 1 + 5 = 6
  • (1行2列の要素) 2 + 6 = 8
  • (2行1列の要素) 3 + 7 = 10
  • (2行2列の要素) 4 + 8 = 12

これを計算すると、結果は次のような行列になります:

A + B = [ 6  8 ]
        [ 10 12 ]

2. スカラー倍

スカラー倍とは、行列全体に対して一つの数(スカラー)を掛け算する操作です。スカラー倍をすると、行列のすべての要素がその数で掛け算されます。

例えば、行列Aに2を掛けると、次のようになります:

A = [ 1  2 ]
    [ 3  4 ]

スカラー倍(2倍)をすると:

A * 2 = [ 1*2  2*2 ]
         [ 3*2  4*2 ]

       = [ 2  4 ]
         [ 6  8 ]

これにより、行列全体がスカラー(2)で倍されました。


コード例

ここでは、JavaScriptを使って行列の加法とスカラー倍を実際に計算してみます。

let A = [[1, 2], [3, 4]];
let B = [[5, 6], [7, 8]];

// 行列の加法
let add = A.map((row, i) => row.map((val, j) => val + B[i][j]));
console.log("行列の加法:", add);

// 行列のスカラー倍
let scalarMultiply = A.map(row => row.map(val => val * 2));
console.log("スカラー倍:", scalarMultiply);

出力例:

行列の加法: [[6, 8], [10, 12]]
スカラー倍: [[2, 4], [6, 8]]

解説:

  • A.map((row, i) => row.map((val, j) => val + B[i][j])) で、行列Aと行列Bの対応する要素を加算しています。
  • A.map(row => row.map(val => val * 2)) で、行列Aの各要素に2を掛けるスカラー倍を行っています。

3. 行列の乗算

行列の乗算は、2つの行列を掛け算する方法です。しかし、単純に対応する位置の要素同士を掛け算するわけではありません。代わりに、各行のベクトルと列のベクトルの内積を取ることで計算します。

行列の乗算の基本的なルール:

例えば、2つの行列AとBが次のようになっているとします:

A = [ a  b ]  B = [ e  f ]
    [ c  d ]      [ g  h ]

行列AとBの乗算結果は、次のように計算されます:

A * B = [ ae + bg  af + bh ]
        [ ce + dg  cf + dh ]

ここでは、行列Aの行と行列Bの列の内積を計算しています。

  • (1行1列の要素): ae + bg(行Aの1行目と列Bの1列目の内積)
  • (1行2列の要素): af + bh(行Aの1行目と列Bの2列目の内積)
  • (2行1列の要素): ce + dg(行Aの2行目と列Bの1列目の内積)
  • (2行2列の要素): cf + dh(行Aの2行目と列Bの2列目の内積)

行列の乗算の実際の計算方法:

  • 行列の乗算は、行列Aの行と行列Bの列を掛け合わせた結果を新しい行列に入れていく形になります。

コード例

let A = [[1, 2], [3, 4]];
let B = [[5, 6], [7, 8]];

// 行列の乗算
let multiply = A.map((row, i) =>
    B[0].map((_, j) => row.reduce((sum, el, k) => sum + el * B[k][j], 0))
);
console.log("行列の乗算:", multiply);

解説:

  • A.map((row, i):行列Aの各行を取得します。
  • B[0].map((_, j):行列Bの各列を取得します。B[0]は行列Bの1行目(列を取得するために必要)。
  • row.reduce((sum, el, k):行Aの各要素を掛け合わせ、列Bの対応する要素と内積を計算しています。
  • sum + el * B[k][j]:各要素を掛け算して合計を求めます。

出力例:

行列の乗算: [[19, 22], [43, 50]]

解説:

  • 行列Aと行列Bを掛け算した結果、次の行列が得られます:

    A * B = [ 19  22 ]
            [ 43  50 ]
    

4. 逆行列

逆行列とは、ある行列と掛け合わせたときに単位行列になる行列です。単位行列は、対角線上に1が並び、それ以外の要素がすべて0である特別な行列です。

逆行列の存在条件:

  • 逆行列が存在するためには、その行列の行列式が0でない必要があります。
  • 行列式が0の場合、逆行列は存在しません。

逆行列の計算方法(2x2行列の場合)

2x2の行列に対して逆行列を計算する方法を説明します。次のような2x2行列があるとします:

A = [ a  b ]
    [ c  d ]

この行列の逆行列 ( A^{-1} ) は、次の式で求められます:

A^-1 = 1 / (ad - bc) * [ d  -b ]
                         [ -c  a ]

ここで、ad - bc は行列Aの行列式です。行列式が0でない場合にのみ逆行列が存在します。

  • 行列式(determinant)は、ad - bc で計算されます。
  • 行列式が0でない場合、逆行列を上記の式で計算できます。

コード例

JavaScriptを使って、2x2行列の逆行列を計算する方法を見てみましょう。

function inverse2x2(matrix) {
    const [a, b, c, d] = [matrix[0][0], matrix[0][1], matrix[1][0], matrix[1][1]];
    const determinant = a * d - b * c; // 行列式の計算

    if (determinant === 0) {
        return null;  // 逆行列が存在しない場合
    }

    // 逆行列の計算
    const inv = [
        [d / determinant, -b / determinant],
        [-c / determinant, a / determinant]
    ];
    return inv;
}

let A = [[4, 7], [2, 6]];  // 例:2x2行列
let invA = inverse2x2(A);   // 逆行列を計算
console.log("逆行列:", invA);

出力例:

逆行列: [[0.6, -0.7], [-0.2, 0.4]]

解説:

  • 行列
    $$ A = \left[ \begin{matrix} 4 & 7 \\ 2 & 6 \end{matrix} \right] $$