C 言語で行列の逆行列を計算する方法

CBeginner
オンラインで実践に進む

はじめに

この実験(Lab)では、C 言語プログラミングを用いて正方行列の逆行列を計算する方法を学びます。逆行列は線形代数における重要な概念であり、連立一次方程式の解法、コンピュータグラフィックス、データ分析、そして多くの科学計算分野で応用されています。

この実験では、正方行列の逆行列を求めるプロセスをいくつかのステップに分けて探求します。具体的には、ユーザー入力から正方行列を読み込み、行列式(determinant)と随伴行列(adjoint)を計算し、最終的にこれらの値を用いて逆行列を計算します。この実験では、これらの数学的演算を C 言語コードで実装する実践的な経験を提供し、プログラミングの概念と線形代数の原理の両方に対する理解を深めます。

この実験の終わりには、完全な逆行列計算プログラムを実装し、そのプロセスに関わる基本的な数学的テクニックを理解できるようになります。

ユーザー入力からの正方行列の読み込み

このステップでは、ユーザー入力から正方行列を読み込むプログラムを作成します。正方行列は、行と列の数が等しく、逆行列を計算するための要件です。

まず、何をする必要があるかを理解しましょう。

  1. 行列の最大サイズを定義する
  2. ユーザーから実際の行列サイズを取得する
  3. 行列の各要素を読み込む
  4. 入力を検証するために行列を表示する

まず、プロジェクトディレクトリに新しい C ファイルを作成しましょう。

  1. WebIDE を開き、プロジェクトディレクトリに移動します
  2. ~/projectディレクトリにmatrix_input.cという名前の新しいファイルを作成します

以下のコードをファイルにコピーします。

#include <stdio.h>
#define MAX_SIZE 10

// Function to read matrix elements from user
void readMatrix(int matrix[MAX_SIZE][MAX_SIZE], int size) {
    printf("Enter the elements of the %dx%d matrix:\n", size, size);
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            printf("Enter element [%d][%d]: ", i, j);
            scanf("%d", &matrix[i][j]);
        }
    }
}

// Function to display the matrix
void displayMatrix(int matrix[MAX_SIZE][MAX_SIZE], int size) {
    printf("\nMatrix Contents:\n");
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            printf("%d\t", matrix[i][j]);
        }
        printf("\n");
    }
}

int main() {
    int matrix[MAX_SIZE][MAX_SIZE];
    int size;

    // Get matrix size from user
    printf("Matrix Input Program\n");
    printf("====================\n");
    printf("Enter the size of the square matrix (1-%d): ", MAX_SIZE);
    scanf("%d", &size);

    // Validate matrix size
    if (size <= 0 || size > MAX_SIZE) {
        printf("Invalid matrix size. Please enter a size between 1 and %d.\n", MAX_SIZE);
        return 1;
    }

    // Read matrix elements
    readMatrix(matrix, size);

    // Display the matrix
    displayMatrix(matrix, size);

    return 0;
}

このコードの主要なコンポーネントを理解しましょう。

  • #define MAX_SIZE 10 - これは、行列の最大サイズの定数を定義します
  • readMatrix() - 行列の各要素を読み込むためにネストされたループを使用する関数です
  • displayMatrix() - 行列を表形式で表示する関数です
  • main()関数では、ユーザーからサイズを取得し、行列を読み込む前にそれを検証します

次に、プログラムをコンパイルして実行しましょう。

  1. WebIDE でターミナルを開きます
  2. 次のコマンドでプログラムをコンパイルします。
    cd ~/project
    gcc matrix_input.c -o matrix_input
  3. プログラムを実行します。
    ./matrix_input

次のような出力が表示されるはずです。

Matrix Input Program
====================
Enter the size of the square matrix (1-10): 3
Enter the elements of the 3x3 matrix:
Enter element [0][0]: 1
Enter element [0][1]: 2
Enter element [0][2]: 3
Enter element [1][0]: 4
Enter element [1][1]: 5
Enter element [1][2]: 6
Enter element [2][0]: 7
Enter element [2][1]: 8
Enter element [2][2]: 9

Matrix Contents:
1	2	3
4	5	6
7	8	9

これで、ユーザー入力から正方行列を読み込み、それを表示するプログラムを正常に作成できました。これは、逆行列計算プロセスの最初のステップです。

行列式と余因子(Cofactor)の計算

行列の逆行列を計算する前に、2 つの重要な数学的演算、つまり行列式(determinant)と余因子(cofactor)を見つけて実装する必要があります。行列式は正方行列から導き出されるスカラー値であり、行列が可逆であるかどうかを判断する上で重要な役割を果たします。

このステップでは、以下を行います。

  1. 行列式と余因子が何かを学びます
  2. それらを計算する関数を実装します
  3. 簡単な行列で実装をテストします

このステップのために新しいファイルを作成しましょう。

  1. ~/projectディレクトリにmatrix_determinant.cという名前の新しいファイルを作成します

以下のコードをファイルにコピーします。

#include <stdio.h>
#define MAX_SIZE 10

// Function to read matrix elements from user
void readMatrix(int matrix[MAX_SIZE][MAX_SIZE], int size) {
    printf("Enter the elements of the %dx%d matrix:\n", size, size);
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            printf("Enter element [%d][%d]: ", i, j);
            scanf("%d", &matrix[i][j]);
        }
    }
}

// Function to get cofactor of matrix[p][q] in temp[][]
void getCofactor(int matrix[MAX_SIZE][MAX_SIZE], int temp[MAX_SIZE][MAX_SIZE],
                 int p, int q, int n) {
    int i = 0, j = 0;

    // Looping for each element of the matrix
    for (int row = 0; row < n; row++) {
        for (int col = 0; col < n; col++) {
            // Copying into temporary matrix only those elements
            // which are not in given row and column
            if (row != p && col != q) {
                temp[i][j++] = matrix[row][col];

                // Row is filled, so increase row index and
                // reset column index
                if (j == n - 1) {
                    j = 0;
                    i++;
                }
            }
        }
    }
}

// Recursive function to find determinant of matrix
int determinant(int matrix[MAX_SIZE][MAX_SIZE], int n) {
    int det = 0; // Initialize result

    // Base case: if matrix contains single element
    if (n == 1)
        return matrix[0][0];

    int temp[MAX_SIZE][MAX_SIZE]; // To store cofactors
    int sign = 1; // To store sign multiplier

    // Iterate for each element of first row
    for (int f = 0; f < n; f++) {
        // Getting cofactor of matrix[0][f]
        getCofactor(matrix, temp, 0, f, n);

        // Adding to determinant with appropriate sign
        det += sign * matrix[0][f] * determinant(temp, n - 1);

        // Alternating sign factor
        sign = -sign;
    }

    return det;
}

// Function to display the matrix
void displayMatrix(int matrix[MAX_SIZE][MAX_SIZE], int size) {
    printf("\nMatrix Contents:\n");
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            printf("%d\t", matrix[i][j]);
        }
        printf("\n");
    }
}

int main() {
    int matrix[MAX_SIZE][MAX_SIZE];
    int size;

    // Get matrix size from user
    printf("Matrix Determinant Calculator\n");
    printf("=============================\n");
    printf("Enter the size of the square matrix (1-%d): ", MAX_SIZE);
    scanf("%d", &size);

    // Validate matrix size
    if (size <= 0 || size > MAX_SIZE) {
        printf("Invalid matrix size. Please enter a size between 1 and %d.\n", MAX_SIZE);
        return 1;
    }

    // Read matrix elements
    readMatrix(matrix, size);

    // Display the matrix
    displayMatrix(matrix, size);

    // Calculate and display the determinant
    int det = determinant(matrix, size);
    printf("\nDeterminant of the matrix is: %d\n", det);

    // Check if matrix is invertible
    if (det == 0) {
        printf("The matrix is not invertible (determinant is zero).\n");
    } else {
        printf("The matrix is invertible (determinant is non-zero).\n");
    }

    return 0;
}

このコードの主要なコンポーネントを理解しましょう。

  • getCofactor() - この関数は、特定の行と列を削除することにより、部分行列を抽出します。これは、行列式と随伴行列を計算するために不可欠です。
  • determinant() - 余因子展開法を使用して行列式を計算する再帰関数です。
  • また、行列式がゼロでないかどうかをテストすることにより、行列が可逆であるかどうかを確認します。

数学的概念の理解:

  1. 余因子(Cofactor): 行列の各要素について、余因子は、その要素の行と列を削除して形成された部分行列の行列式に、(-1)^(i+j) を掛けたものです。ここで、i, j は行と列のインデックスです。

  2. 行列式(Determinant): 行列式は、正方行列から計算される特別な数値です。2×2 行列[[a,b],[c,d]]の場合、行列式は (a×d - b×c) です。より大きな行列の場合は、余因子展開を使用します。

  3. 可逆性(Invertibility): 行列は、その行列式がゼロでない場合にのみ可逆です。

次に、プログラムをコンパイルして実行しましょう。

  1. 次のコマンドでプログラムをコンパイルします。
    cd ~/project
    gcc matrix_determinant.c -o matrix_determinant
  2. プログラムを実行します。
    ./matrix_determinant

次のような出力が表示されるはずです。

Matrix Determinant Calculator
=============================
Enter the size of the square matrix (1-10): 3
Enter the elements of the 3x3 matrix:
Enter element [0][0]: 1
Enter element [0][1]: 2
Enter element [0][2]: 3
Enter element [1][0]: 0
Enter element [1][1]: 1
Enter element [1][2]: 4
Enter element [2][0]: 5
Enter element [2][1]: 6
Enter element [2][2]: 0

Matrix Contents:
1	2	3
0	1	4
5	6	0

Determinant of the matrix is: 49
The matrix is invertible (determinant is non-zero).

行列式がゼロになるような行列を含む、さまざまな行列を入力して、プログラムの動作を確認してください。たとえば、ある行が別の行の倍数である行列を入力すると、行列式はゼロになるはずです。

これで、行列の逆行列を見つけるための重要なコンポーネントである行列式の計算を正常に実装できました。

行列の随伴行列(Adjoint)の計算

行列の逆行列を計算する次のステップは、行列の随伴行列(adjoint、別名 adjugate)を計算することです。行列の随伴行列は、余因子行列の転置行列です。行列の随伴行列と行列式が得られたら、次の公式を使用して逆行列を計算できます。

逆行列 (A) = 随伴行列 (A) / 行列式 (A)

このステップでは、以下を行います。

  1. 随伴行列計算関数を実装します
  2. 最終的な行列反転の準備として、以前のコードを基に構築します

このステップのために新しいファイルを作成しましょう。

  1. ~/projectディレクトリにmatrix_adjoint.cという名前の新しいファイルを作成します

以下のコードをファイルにコピーします。

#include <stdio.h>
#define MAX_SIZE 10

// Function to read matrix elements from user
void readMatrix(int matrix[MAX_SIZE][MAX_SIZE], int size) {
    printf("Enter the elements of the %dx%d matrix:\n", size, size);
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            printf("Enter element [%d][%d]: ", i, j);
            scanf("%d", &matrix[i][j]);
        }
    }
}

// Function to get cofactor of matrix[p][q] in temp[][]
void getCofactor(int matrix[MAX_SIZE][MAX_SIZE], int temp[MAX_SIZE][MAX_SIZE],
                 int p, int q, int n) {
    int i = 0, j = 0;

    for (int row = 0; row < n; row++) {
        for (int col = 0; col < n; col++) {
            if (row != p && col != q) {
                temp[i][j++] = matrix[row][col];

                if (j == n - 1) {
                    j = 0;
                    i++;
                }
            }
        }
    }
}

// Recursive function to find determinant of matrix
int determinant(int matrix[MAX_SIZE][MAX_SIZE], int n) {
    int det = 0;

    if (n == 1)
        return matrix[0][0];

    int temp[MAX_SIZE][MAX_SIZE];
    int sign = 1;

    for (int f = 0; f < n; f++) {
        getCofactor(matrix, temp, 0, f, n);
        det += sign * matrix[0][f] * determinant(temp, n - 1);
        sign = -sign;
    }

    return det;
}

// Function to calculate the adjoint of a matrix
void adjoint(int matrix[MAX_SIZE][MAX_SIZE], int adj[MAX_SIZE][MAX_SIZE], int n) {
    if (n == 1) {
        adj[0][0] = 1;
        return;
    }

    int sign = 1;
    int temp[MAX_SIZE][MAX_SIZE];

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            // Get cofactor of matrix[i][j]
            getCofactor(matrix, temp, i, j, n);

            // Sign of adj[j][i] positive if sum of row and column indices is even
            sign = ((i + j) % 2 == 0) ? 1 : -1;

            // Interchanging rows and columns to get the transpose of the cofactor matrix
            adj[j][i] = sign * determinant(temp, n - 1);
        }
    }
}

// Function to display the matrix
void displayMatrix(int matrix[MAX_SIZE][MAX_SIZE], int size) {
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            printf("%d\t", matrix[i][j]);
        }
        printf("\n");
    }
}

int main() {
    int matrix[MAX_SIZE][MAX_SIZE];
    int adj[MAX_SIZE][MAX_SIZE];
    int size;

    // Get matrix size from user
    printf("Matrix Adjoint Calculator\n");
    printf("=========================\n");
    printf("Enter the size of the square matrix (1-%d): ", MAX_SIZE);
    scanf("%d", &size);

    // Validate matrix size
    if (size <= 0 || size > MAX_SIZE) {
        printf("Invalid matrix size. Please enter a size between 1 and %d.\n", MAX_SIZE);
        return 1;
    }

    // Read matrix elements
    readMatrix(matrix, size);

    // Display the original matrix
    printf("\nOriginal Matrix:\n");
    displayMatrix(matrix, size);

    // Calculate the adjoint
    adjoint(matrix, adj, size);

    // Display the adjoint matrix
    printf("\nAdjoint Matrix:\n");
    displayMatrix(adj, size);

    // Calculate and display the determinant
    int det = determinant(matrix, size);
    printf("\nDeterminant of the matrix is: %d\n", det);

    return 0;
}

このコードの主要な新しいコンポーネントを理解しましょう。

  • adjoint() - この関数は、行列の随伴行列を計算します。これは、余因子行列の転置行列です。行列の各要素 (i,j) について、次のことを行います。
    1. 行 i と列 j を削除して余因子行列を見つけます
    2. この余因子行列の行列式を計算します
    3. 適切な符号 ((−1)^(i+j)) を適用します
    4. この値を随伴行列の (j,i) の位置に配置します(転置)

随伴行列の計算の理解:

行列 A の随伴行列(または adjugate)は adj(A) と表記されます。2×2 行列の場合:

A = [a b]
    [c d]

随伴行列は次のようになります。

adj(A) = [ d  -b]
         [-c   a]

より大きな行列の場合、各要素の余因子を計算し、結果の行列を転置します。

次に、プログラムをコンパイルして実行しましょう。

  1. 次のコマンドでプログラムをコンパイルします。
    cd ~/project
    gcc matrix_adjoint.c -o matrix_adjoint
  2. プログラムを実行します。
    ./matrix_adjoint

次のような出力が表示されるはずです。

Matrix Adjoint Calculator
=========================
Enter the size of the square matrix (1-10): 3
Enter the elements of the 3x3 matrix:
Enter element [0][0]: 1
Enter element [0][1]: 0
Enter element [0][2]: 2
Enter element [1][0]: 3
Enter element [1][1]: 0
Enter element [1][2]: 4
Enter element [2][0]: 5
Enter element [2][1]: 0
Enter element [2][2]: 6

Original Matrix:
1	0	2
3	0	4
5	0	6

Adjoint Matrix:
0	0	0
-8	-4	4
0	0	0

Determinant of the matrix is: 0

この例では、行列式が 0 であることに注意してください。これは、行列が可逆ではないことを意味します。可逆行列の別の例を試してみましょう。

Matrix Adjoint Calculator
=========================
Enter the size of the square matrix (1-10): 3
Enter the elements of the 3x3 matrix:
Enter element [0][0]: 5
Enter element [0][1]: -2
Enter element [0][2]: 2
Enter element [1][0]: 1
Enter element [1][1]: 0
Enter element [1][2]: 3
Enter element [2][0]: 3
Enter element [2][1]: 1
Enter element [2][2]: 4

Original Matrix:
5	-2	2
1	0	3
3	1	4

Adjoint Matrix:
-3	11	-5
13	14	-11
-1	-7	2

Determinant of the matrix is: 15

この場合、行列式は 15(ゼロ以外)であり、この行列の逆行列を計算できます。これで、随伴行列の計算を正常に実装できました。これは、行列反転の最終ステップの前のステップです。

行列の逆行列の計算

行列の行列式と随伴行列の両方を計算する関数を実装したので、ついに行列の逆行列を計算できます。前述のように、逆行列を見つけるための公式は次のとおりです。

逆行列 (A) = 随伴行列 (A) / 行列式 (A)

この最終ステップでは、以下を行います。

  1. 行列反転関数を実装します
  2. 行列を読み込み、その逆行列を計算する完全なプログラムを作成します
  3. より読みやすくするために、出力フォーマットを強化します

この最終ステップのために新しいファイルを作成しましょう。

  1. ~/projectディレクトリにmatrix_inverse.cという名前の新しいファイルを作成します

以下のコードをファイルにコピーします。

#include <stdio.h>
#define MAX_SIZE 10

// Function to read matrix elements from user
void readMatrix(int matrix[MAX_SIZE][MAX_SIZE], int size) {
    printf("Enter the elements of the %dx%d matrix:\n", size, size);
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            printf("Enter element [%d][%d]: ", i, j);
            scanf("%d", &matrix[i][j]);
        }
    }
}

// Function to get cofactor of matrix[p][q] in temp[][]
void getCofactor(int matrix[MAX_SIZE][MAX_SIZE], int temp[MAX_SIZE][MAX_SIZE],
                 int p, int q, int n) {
    int i = 0, j = 0;

    for (int row = 0; row < n; row++) {
        for (int col = 0; col < n; col++) {
            if (row != p && col != q) {
                temp[i][j++] = matrix[row][col];

                if (j == n - 1) {
                    j = 0;
                    i++;
                }
            }
        }
    }
}

// Recursive function to find determinant of matrix
int determinant(int matrix[MAX_SIZE][MAX_SIZE], int n) {
    int det = 0;

    if (n == 1)
        return matrix[0][0];

    int temp[MAX_SIZE][MAX_SIZE];
    int sign = 1;

    for (int f = 0; f < n; f++) {
        getCofactor(matrix, temp, 0, f, n);
        det += sign * matrix[0][f] * determinant(temp, n - 1);
        sign = -sign;
    }

    return det;
}

// Function to calculate the adjoint of a matrix
void adjoint(int matrix[MAX_SIZE][MAX_SIZE], int adj[MAX_SIZE][MAX_SIZE], int n) {
    if (n == 1) {
        adj[0][0] = 1;
        return;
    }

    int sign = 1;
    int temp[MAX_SIZE][MAX_SIZE];

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            // Get cofactor of matrix[i][j]
            getCofactor(matrix, temp, i, j, n);

            // Sign of adj[j][i] positive if sum of row and column indices is even
            sign = ((i + j) % 2 == 0) ? 1 : -1;

            // Interchanging rows and columns to get the transpose of the cofactor matrix
            adj[j][i] = sign * determinant(temp, n - 1);
        }
    }
}

// Function to calculate the inverse of a matrix
int inverse(int matrix[MAX_SIZE][MAX_SIZE], float inverse[MAX_SIZE][MAX_SIZE], int n) {
    // Find determinant of matrix
    int det = determinant(matrix, n);

    // If determinant is zero, matrix is not invertible
    if (det == 0) {
        printf("Matrix is not invertible as determinant is zero.\n");
        return 0;
    }

    // Find adjoint of matrix
    int adj[MAX_SIZE][MAX_SIZE];
    adjoint(matrix, adj, n);

    // Find inverse by dividing adjoint by determinant
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            inverse[i][j] = adj[i][j] / (float)det;
        }
    }

    return 1;
}

// Function to display an integer matrix
void displayMatrix(int matrix[MAX_SIZE][MAX_SIZE], int size) {
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            printf("%d\t", matrix[i][j]);
        }
        printf("\n");
    }
}

// Function to display a float matrix (for inverse)
void displayFloatMatrix(float matrix[MAX_SIZE][MAX_SIZE], int size) {
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            printf("%.4f\t", matrix[i][j]);
        }
        printf("\n");
    }
}

int main() {
    int matrix[MAX_SIZE][MAX_SIZE];
    float inv[MAX_SIZE][MAX_SIZE];
    int size;

    // Get matrix size from user
    printf("Matrix Inverse Calculator\n");
    printf("=========================\n");
    printf("Enter the size of the square matrix (1-%d): ", MAX_SIZE);
    scanf("%d", &size);

    // Validate matrix size
    if (size <= 0 || size > MAX_SIZE) {
        printf("Invalid matrix size. Please enter a size between 1 and %d.\n", MAX_SIZE);
        return 1;
    }

    // Read matrix elements
    readMatrix(matrix, size);

    // Display the original matrix
    printf("\nOriginal Matrix:\n");
    displayMatrix(matrix, size);

    // Calculate and display the determinant
    int det = determinant(matrix, size);
    printf("\nDeterminant of the matrix is: %d\n", det);

    // Calculate and display the inverse
    if (inverse(matrix, inv, size)) {
        printf("\nInverse Matrix:\n");
        displayFloatMatrix(inv, size);
    }

    return 0;
}

このコードの主要な新しいコンポーネントを理解しましょう。

  • inverse() - この関数は、次の手順で行列の逆行列を計算します。

    1. 行列式を見つける
    2. 行列式がゼロ以外であるか(可逆であるか)を確認する
    3. 随伴行列を計算する
    4. 随伴行列の各要素を行列式で割る
  • displayFloatMatrix() - 逆行列の要素が必ずしも整数ではないため、浮動小数点精度で逆行列を表示するための新しい関数です。

行列反転の理解:

行列 A の場合、逆行列 A^(-1) は、方程式 A × A^(-1) = A^(-1) × A = I を満たします。ここで、I は単位行列です。

私たちが使用している公式は次のとおりです。A^(-1) = adj(A) / det(A)

次に、プログラムをコンパイルして実行しましょう。

  1. 次のコマンドでプログラムをコンパイルします。
    cd ~/project
    gcc matrix_inverse.c -o matrix_inverse
  2. プログラムを実行します。
    ./matrix_inverse

次のような出力が表示されるはずです。

Matrix Inverse Calculator
=========================
Enter the size of the square matrix (1-10): 3
Enter the elements of the 3x3 matrix:
Enter element [0][0]: 4
Enter element [0][1]: 3
Enter element [0][2]: 1
Enter element [1][0]: 0
Enter element [1][1]: -1
Enter element [1][2]: 2
Enter element [2][0]: -3
Enter element [2][1]: 3
Enter element [2][2]: 1

Original Matrix:
4	3	1
0	-1	2
-3	3	1

Determinant of the matrix is: 37

Inverse Matrix:
0.0270	0.1351	-0.1351
0.2432	-0.0541	-0.2432
-0.1081	0.4865	0.1081

結果を確認しましょう。元の行列とその逆行列の積は、単位行列に非常に近いはずです。小さな行列については、これを手動で検証できます。

2×2 の例として、試してみましょう。

Matrix Inverse Calculator
=========================
Enter the size of the square matrix (1-10): 2
Enter the elements of the 2x2 matrix:
Enter element [0][0]: 4
Enter element [0][1]: 7
Enter element [1][0]: 2
Enter element [1][1]: 6

Original Matrix:
4	7
2	6

Determinant of the matrix is: 10

Inverse Matrix:
0.6000	-0.7000
-0.2000	0.4000

2×2 行列の場合、次の公式を使用して逆行列を簡単に検証できます。
行列 A = [[a, b], [c, d]]の場合、逆行列は次のようになります。
A^(-1) = (1/det(A)) × [[d, -b], [-c, a]]

ここで、det(A) = a×d - b×c

この例では:
det(A) = 4×6 - 7×2 = 24 - 14 = 10
A^(-1) = (1/10) × [[6, -7], [-2, 4]] = [[0.6, -0.7], [-0.2, 0.4]]

おめでとうございます!これで、C で完全な行列逆行列計算機を正常に実装できました。

まとめ

この実験では、C プログラミングで完全な行列逆行列計算機を実装しました。この実験を通して、いくつかの重要な概念を探求し、それらを段階的に実装しました。

  1. まず、ユーザー入力から正方行列を読み込み、それを表示するプログラムを作成し、C での 2 次元配列の処理方法を学びました。

  2. 次に、余因子展開法を使用して行列式計算を実装しました。これは、行列反転の基礎となる再帰的なアプローチです。

  3. 次に、コードを基に、余因子行列の転置行列である随伴行列を計算しました。

  4. 最後に、これらのすべてのコンポーネントを組み合わせて、公式:逆行列 = 随伴行列 / 行列式を使用して行列の逆行列を計算しました。

これらの数学的演算は線形代数の基本であり、コンピューターグラフィックス、機械学習、連立一次方程式の解法など、さまざまな分野で幅広い応用があります。

この実装では、次のようないくつかのプログラミング概念が示されました。

  • 多次元配列
  • 再帰関数
  • 整数と浮動小数点数の間の型変換
  • 関数のモジュール性とコードの組織化
  • ユーザー入力の検証

この実験を完了することにより、行列演算、特に行列反転の数学的理論とプログラミング実装の両方に関する実践的な経験を得ることができました。