行列(ベクトル)

[C言語] 単位行列を作成する方法

C言語で単位行列を作成するには、まず正方行列を表す2次元配列を宣言します。

次に、行列のサイズを決定し、すべての要素を0で初期化します。

その後、対角線上の要素(行と列のインデックスが等しい要素)に1を代入します。

これにより、単位行列が完成します。

例えば、3×3の単位行列を作成する場合、3×3の配列を用意し、matrix[i][i] = 1という操作を行います。

これにより、対角線上に1が配置され、他の要素は0のままとなります。

単位行列とは

単位行列の定義

単位行列とは、線形代数において特別な役割を持つ正方行列の一種です。

具体的には、対角線上の要素がすべて1であり、それ以外の要素がすべて0である行列を指します。

単位行列は通常、記号 I で表され、サイズnの単位行列はn×nの正方行列です。

単位行列の特性

単位行列には以下のような特性があります:

  • 乗法単位元: 任意の行列Aに対して、Aと単位行列Iの積はA自身になります。

すなわち、AI = IA = Aです。

  • 対称性: 単位行列は対称行列であり、転置行列を取っても変わりません。
  • 逆行列: 単位行列は自分自身が逆行列であり、Iの逆行列はIです。

単位行列の用途

単位行列は、以下のような用途で広く利用されます:

  • 行列の同一性確認: 行列の積において、元の行列を変化させない役割を持つため、同一性の確認に使用されます。
  • 逆行列の計算: 逆行列を求める際の基準として利用されます。

行列Aの逆行列A⁻¹が存在する場合、AA⁻¹ = A⁻¹A = Iとなります。

  • 線形変換: 線形代数における変換行列として、座標系の変換や回転などの操作において基準となる行列です。

単位行列は、数学的な理論だけでなく、実際のプログラミングや計算においても重要な役割を果たします。

C言語での行列の基本

行列を表現するためのデータ構造

C言語では、行列を表現するために二次元配列を使用します。

二次元配列は、行と列のインデックスを持ち、行列の各要素にアクセスすることができます。

以下は、3×3の行列を表現するための二次元配列の宣言例です。

int matrix[3][3];

この宣言により、3行3列の整数型行列が作成されます。

行列の初期化方法

行列を初期化するには、二次元配列を宣言すると同時に初期値を設定します。

以下は、3×3の行列を初期化する例です。

int matrix[3][3] = {
    {1, 0, 0},
    {0, 1, 0},
    {0, 0, 1}
};

この例では、単位行列を初期化しています。

各行の要素を波括弧で囲み、行ごとにカンマで区切って記述します。

行列の要素へのアクセス

行列の要素にアクセスするには、行と列のインデックスを指定します。

インデックスは0から始まるため、最初の要素はmatrix[0][0]でアクセスできます。

以下は、行列の要素にアクセスして値を出力する例です。

#include <stdio.h>
int main() {
    int matrix[3][3] = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };
    // 行列の要素を出力
    printf("Element at (1,2): %d\n", matrix[1][2]); // 6を出力
    return 0;
}
Element at (1,2): 6

このプログラムでは、行列の2行目(インデックス1)と3列目(インデックス2)の要素にアクセスし、その値を出力しています。

行列の要素へのアクセスは、行列の操作や計算において基本的な操作となります。

単位行列の作成手順

配列の宣言と初期化

単位行列を作成するためには、まず行列を表現するための二次元配列を宣言します。

ここでは、サイズnの単位行列を作成する例を示します。

配列を宣言した後、すべての要素を0で初期化します。

#include <stdio.h>
#define SIZE 3
int main() {
    int identityMatrix[SIZE][SIZE] = {0}; // すべての要素を0で初期化
    return 0;
}

このコードでは、3×3の行列を宣言し、すべての要素を0で初期化しています。

対角線上の要素の設定

次に、単位行列の特性に従って、対角線上の要素を1に設定します。

これにより、単位行列が完成します。

#include <stdio.h>
#define SIZE 3
int main() {
    int identityMatrix[SIZE][SIZE] = {0};
    // 対角線上の要素を1に設定
    for (int i = 0; i < SIZE; i++) {
        identityMatrix[i][i] = 1;
    }
    return 0;
}

このループでは、行列の対角線上の要素identityMatrix[i][i]を1に設定しています。

完成した単位行列の確認

最後に、作成した単位行列を出力して確認します。

以下のコードは、単位行列をコンソールに表示する例です。

#include <stdio.h>
#define SIZE 3
int main() {
    int identityMatrix[SIZE][SIZE] = {0};
    // 対角線上の要素を1に設定
    for (int i = 0; i < SIZE; i++) {
        identityMatrix[i][i] = 1;
    }
    // 単位行列を出力
    for (int i = 0; i < SIZE; i++) {
        for (int j = 0; j < SIZE; j++) {
            printf("%d ", identityMatrix[i][j]);
        }
        printf("\n");
    }
    return 0;
}
1 0 0 
0 1 0 
0 0 1 

このプログラムは、3×3の単位行列を作成し、各要素を出力しています。

対角線上の要素が1で、それ以外が0であることを確認できます。

これにより、単位行列が正しく作成されたことがわかります。

単位行列を利用したプログラム例

単位行列の表示

単位行列を表示するプログラムは、単位行列を作成し、その内容をコンソールに出力するものです。

以下のコードは、3×3の単位行列を表示する例です。

#include <stdio.h>
#define SIZE 3
int main() {
    int identityMatrix[SIZE][SIZE] = {0};
    // 対角線上の要素を1に設定
    for (int i = 0; i < SIZE; i++) {
        identityMatrix[i][i] = 1;
    }
    // 単位行列を表示
    printf("単位行列:\n");
    for (int i = 0; i < SIZE; i++) {
        for (int j = 0; j < SIZE; j++) {
            printf("%d ", identityMatrix[i][j]);
        }
        printf("\n");
    }
    return 0;
}
単位行列:
1 0 0 
0 1 0 
0 0 1 

このプログラムは、単位行列を作成し、その内容を行ごとに出力します。

単位行列を用いた行列の積

単位行列を用いて他の行列と積を計算すると、元の行列がそのまま得られます。

以下のコードは、3×3の行列と単位行列の積を計算する例です。

#include <stdio.h>
#define SIZE 3
int main() {
    int matrix[SIZE][SIZE] = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };
    int identityMatrix[SIZE][SIZE] = {0};
    int result[SIZE][SIZE] = {0};
    // 単位行列の作成
    for (int i = 0; i < SIZE; i++) {
        identityMatrix[i][i] = 1;
    }
    // 行列の積を計算
    for (int i = 0; i < SIZE; i++) {
        for (int j = 0; j < SIZE; j++) {
            for (int k = 0; k < SIZE; k++) {
                result[i][j] += matrix[i][k] * identityMatrix[k][j];
            }
        }
    }
    // 結果を表示
    printf("行列と単位行列の積:\n");
    for (int i = 0; i < SIZE; i++) {
        for (int j = 0; j < SIZE; j++) {
            printf("%d ", result[i][j]);
        }
        printf("\n");
    }
    return 0;
}
行列と単位行列の積:
1 2 3 
4 5 6 
7 8 9 

このプログラムは、元の行列と単位行列の積を計算し、結果を出力します。

結果は元の行列と同じです。

単位行列のサイズ変更

単位行列のサイズを変更するには、配列のサイズを変更し、対角線上の要素を1に設定するループの範囲を調整します。

以下のコードは、サイズを変更可能な単位行列を作成する例です。

#include <stdio.h>
void createIdentityMatrix(int size) {
    int identityMatrix[size][size];
    // 単位行列の作成
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            identityMatrix[i][j] = (i == j) ? 1 : 0;
        }
    }
    // 単位行列を表示
    printf("サイズ %d の単位行列:\n", size);
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            printf("%d ", identityMatrix[i][j]);
        }
        printf("\n");
    }
}
int main() {
    int size = 4; // 単位行列のサイズを指定
    createIdentityMatrix(size);
    return 0;
}
サイズ 4 の単位行列:
1 0 0 0 
0 1 0 0 
0 0 1 0 
0 0 0 1 

このプログラムは、指定されたサイズの単位行列を作成し、その内容を出力します。

サイズを変更することで、異なる次元の単位行列を生成できます。

応用例

単位行列を用いた逆行列の計算

逆行列の計算において、単位行列は重要な役割を果たします。

行列Aの逆行列A⁻¹が存在する場合、AA⁻¹ = A⁻¹A = Iとなります。

この性質を利用して、逆行列を求めることができます。

以下は、ガウス・ジョルダン法を用いて逆行列を求める際に単位行列を使用する例です。

#include <stdio.h>
#define SIZE 3
void printMatrix(float matrix[SIZE][SIZE]) {
    for (int i = 0; i < SIZE; i++) {
        for (int j = 0; j < SIZE; j++) {
            printf("%.2f ", matrix[i][j]);
        }
        printf("\n");
    }
}
void gaussJordan(float matrix[SIZE][SIZE], float inverse[SIZE][SIZE]) {
    for (int i = 0; i < SIZE; i++) {
        for (int j = 0; j < SIZE; j++) {
            inverse[i][j] = (i == j) ? 1.0 : 0.0;
        }
    }
    for (int i = 0; i < SIZE; i++) {
        float pivot = matrix[i][i];
        for (int j = 0; j < SIZE; j++) {
            matrix[i][j] /= pivot;
            inverse[i][j] /= pivot;
        }
        for (int k = 0; k < SIZE; k++) {
            if (k != i) {
                float factor = matrix[k][i];
                for (int j = 0; j < SIZE; j++) {
                    matrix[k][j] -= factor * matrix[i][j];
                    inverse[k][j] -= factor * inverse[i][j];
                }
            }
        }
    }
}
int main() {
    float matrix[SIZE][SIZE] = {
        {2, 1, 1},
        {1, 3, 2},
        {1, 0, 0}
    };
    float inverse[SIZE][SIZE];
    gaussJordan(matrix, inverse);
    printf("逆行列:\n");
    printMatrix(inverse);
    return 0;
}
逆行列:
0.00 0.00 1.00 
-2.00 1.00 3.00 
3.00 -1.00 -5.00 

このプログラムは、ガウス・ジョルダン法を用いて逆行列を計算し、結果を出力します。

単位行列を初期化して、逆行列の計算に利用しています。

単位行列を用いた行列の対角化

行列の対角化は、行列を対角行列に変換する操作で、単位行列はこの過程で基準として使用されます。

対角化は、固有値と固有ベクトルを用いて行われますが、ここでは単位行列を用いた基本的な概念を説明します。

行列Aが対角化可能である場合、A = PDP⁻¹という形に表せます。

ここで、Pは固有ベクトルを列に持つ行列、Dは対角行列です。

単位行列は、P⁻¹を求める際に使用されます。

単位行列を用いた線形代数の応用

単位行列は、線形代数のさまざまな応用において基礎的な役割を果たします。

以下にいくつかの応用例を示します。

  • 線形方程式の解法: 単位行列を用いて、行列方程式AX = Bの解を求める際に、逆行列を計算してX = A⁻¹Bを求めることができます。
  • 行列の冪乗計算: 単位行列は、行列の冪乗計算において初期値として使用されます。

例えば、Aの0乗は単位行列Iです。

  • 変換行列の基準: 単位行列は、座標変換や回転行列の基準として使用され、変換が行われない場合の基準状態を示します。

これらの応用例は、単位行列が数学的な理論だけでなく、実際の計算やプログラミングにおいても重要であることを示しています。

まとめ

この記事では、C言語を用いて単位行列を作成する方法について詳しく解説しました。

単位行列の定義や特性、用途を理解することで、行列計算における基礎的な役割を把握できたのではないでしょうか。

これを機に、実際にプログラムを作成し、単位行列を活用したさまざまな行列操作に挑戦してみてください。

関連記事

Back to top button