C 言語で 2 つの行列を加算する方法

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

はじめに

この実験では、C プログラミングで 2 つの行列を加算する方法を学びます。この実験では、両方の行列の次元と要素を読み込む、対応する要素を加算する、そして結果の行列を出力する、という手順をカバーします。まず、行列の次元と要素を読み込む C プログラムを作成し、次に行列加算のロジックを実装し、最後に最終的な行列を出力します。この実験は、C を用いた行列と線形代数の操作に関する実践的な経験を提供することを目的としています。

両方の行列の次元と要素の読み込み

このステップでは、C プログラムで 2 つの行列の次元と要素を読み込む方法を学びます。行列の加算では、行列のサイズが同じである必要があります。そのため、最初に行列の次元と要素の入力を実装します。

行列加算プログラムの作成

まず、行列加算用の新しい C ファイルを作成します。

cd ~/project
nano matrix_addition.c

次に、行列の次元と要素を読み込むコードを記述します。

#include <stdio.h>

#define MAX_SIZE 10

int main() {
    int rows, cols;
    int matrix1[MAX_SIZE][MAX_SIZE], matrix2[MAX_SIZE][MAX_SIZE];

    // 行列の次元を読み込む
    printf("Enter number of rows (max %d): ", MAX_SIZE);
    scanf("%d", &rows);
    printf("Enter number of columns (max %d): ", MAX_SIZE);
    scanf("%d", &cols);

    // 最初の行列の要素を入力
    printf("Enter elements of first matrix:\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("Enter element [%d][%d]: ", i, j);
            scanf("%d", &matrix1[i][j]);
        }
    }

    // 二番目の行列の要素を入力
    printf("Enter elements of second matrix:\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("Enter element [%d][%d]: ", i, j);
            scanf("%d", &matrix2[i][j]);
        }
    }

    return 0;
}

プログラムのコンパイルと実行

プログラムをコンパイルします。

gcc matrix_addition.c -o matrix_addition

例出力

プログラムを実行すると、行列の次元と要素を入力するよう求められます。

Enter number of rows (max 10): 2
Enter number of columns (max 10): 3
Enter elements of first 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 elements of second matrix:
Enter element [0][0]: 7
Enter element [0][1]: 8
Enter element [0][2]: 9
Enter element [1][0]: 10
Enter element [1][1]: 11
Enter element [1][2]: 12

コードの説明

  • #define MAX_SIZE 10 は、行列の次元の最大値を設定します。
  • scanf() は、行数、列数、および行列要素の整数入力を読み取るために使用されます。
  • ネストされた for ループは、両方の行列の要素を入力するために使用されます。
  • プログラムは、行列の次元が定義された最大サイズ内にあることを確認します。

対応する要素の加算

このステップでは、2 つの行列の対応する要素を加算し、その結果を新しい行列に格納する方法を学びます。

行列加算プログラムの更新

以前の C ファイルを開きます。

cd ~/project
nano matrix_addition.c

行列要素を加算するようにプログラムを修正します。

#include <stdio.h>

#define MAX_SIZE 10

int main() {
    int rows, cols;
    int matrix1[MAX_SIZE][MAX_SIZE], matrix2[MAX_SIZE][MAX_SIZE], result[MAX_SIZE][MAX_SIZE];

    // 前の入力コードは同じままです
    // ... (matrix1 と matrix2 の次元と要素の入力)

    // 対応する要素を加算する
    printf("\nResulting Matrix (Matrix1 + Matrix2):\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            result[i][j] = matrix1[i][j] + matrix2[i][j];
            printf("%d ", result[i][j]);
        }
        printf("\n");
    }

    return 0;
}

プログラムのコンパイルと実行

更新されたプログラムをコンパイルします。

gcc matrix_addition.c -o matrix_addition

プログラムを実行します。

./matrix_addition

例出力

Enter number of rows (max 10): 2
Enter number of columns (max 10): 3
Enter elements of first 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 elements of second matrix:
Enter element [0][0]: 7
Enter element [0][1]: 8
Enter element [0][2]: 9
Enter element [1][0]: 10
Enter element [1][1]: 11
Enter element [1][2]: 12

Resulting Matrix (Matrix1 + Matrix2):
8 10 12
14 16 18

コードの説明

  • 行列要素の合計を格納するための新しい 2 次元配列resultが作成されます。
  • ネストされたforループは、両方の行列の各要素を反復処理します。
  • result[i][j] = matrix1[i][j] + matrix2[i][j] は、対応する要素を加算します。
  • printf() は、結果の行列を表示するために使用されます。

結果行列の出力

このステップでは、結果の行列をきれいで読みやすい方法でフォーマットして出力する方法を学びます。

行列出力関数の強化

以前の C ファイルを開きます。

cd ~/project
nano matrix_addition.c

専用の行列出力関数でプログラムを更新します。

#include <stdio.h>

#define MAX_SIZE 10

// 行列を出力する関数
void printMatrix(int matrix[MAX_SIZE][MAX_SIZE], int rows, int cols, const char* matrixName) {
    printf("%s:\n", matrixName);
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%4d ", matrix[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}

int main() {
    int rows, cols;
    int matrix1[MAX_SIZE][MAX_SIZE], matrix2[MAX_SIZE][MAX_SIZE], result[MAX_SIZE][MAX_SIZE];

    // 前の入力コードは同じままです
    // ... (matrix1 と matrix2 の次元と要素の入力)

    // 対応する要素を加算する
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            result[i][j] = matrix1[i][j] + matrix2[i][j];
        }
    }

    // 行列を出力する
    printMatrix(matrix1, rows, cols, "First Matrix");
    printMatrix(matrix2, rows, cols, "Second Matrix");
    printMatrix(result, rows, cols, "Resulting Matrix (Matrix1 + Matrix2)");

    return 0;
}

プログラムのコンパイルと実行

更新されたプログラムをコンパイルします。

gcc matrix_addition.c -o matrix_addition

プログラムを実行します。

./matrix_addition

例出力

Enter number of rows (max 10): 2
Enter number of columns (max 10): 3
Enter elements of first 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 elements of second matrix:
Enter element [0][0]: 7
Enter element [0][1]: 8
Enter element [0][2]: 9
Enter element [1][0]: 10
Enter element [1][1]: 11
Enter element [1][2]: 12

First Matrix:
   1    2    3

Second Matrix:
   7    8    9

Resulting Matrix (Matrix1 + Matrix2):
   8   10   12

コードの説明

  • printMatrix() 関数は、一貫したフォーマットで行列を出力するために作成されます。
  • %4d フォーマット指定子は、整列された列出力を実現します。
  • 関数は行列、次元、および名前を引数として受け取ります。
  • 行列は説明的な見出し付きで出力されます。
  • ネストされたループは、行列要素の出力のために反復処理します。

まとめ

この実験では、C プログラムで 2 つの行列の次元と要素を読み取る方法を学びました。これは、行列の加算において同じサイズの行列が必要となるため、重要なステップです。行列の次元と要素の入力を実装し、プログラムが最大 10x10 の行列を処理できるようにしました。

行列の次元と要素を読み取った後、次のステップは、2 つの行列の対応する要素を加算し、結果の行列を格納することです。