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

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

はじめに

この実験では、C 言語で行列の転置を計算する方法を学びます。この実験は、以下の手順で構成されています。

次元と要素の読み込み:行列の次元 (行数と列数) を読み込み、ユーザー入力の値で行列を埋める方法を学びます。このステップは、行列の転置処理の基礎となります。

行と列の交換:行列の転置の中心は、元の行列の行と列を入れ替えて転置行列を作成することです。

転置行列の出力:最後に、転置行列を表示する方法を学び、転置処理の正しさを確認することができます。

この実験の終わりまでに、行列の転置に関する確かな理解と、C 言語でそれを実装する能力を身につけることができます。

次元と要素の読み込み

このステップでは、行列の転置を行う C プログラムで、行列の次元と要素を読み込む方法を学びます。ユーザーに行数と列数を入力させ、その後、行列の値を入力させるプログラムを作成します。

まず、行列転置プログラム用の新しい C ファイルを作成しましょう。

cd ~/project
nano matrix_transpose.c

次に、行列の次元と要素を読み込むための以下のコードを追加します。

#include <stdio.h>

#define MAX_ROWS 100
#define MAX_COLS 100

int main() {
    int rows, cols;
    int matrix[MAX_ROWS][MAX_COLS];

    // 行列の次元を読み込む
    printf("行数を入力してください:");
    scanf("%d", &rows);

    printf("列数を入力してください:");
    scanf("%d", &cols);

    // 行列要素を入力
    printf("行列要素を入力してください:\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("要素 [%d][%d] を入力してください:", i, j);
            scanf("%d", &matrix[i][j]);
        }
    }

    // 元の行列を出力
    printf("\n元の行列:\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }

    return 0;
}

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

gcc matrix_transpose.c -o matrix_transpose
./matrix_transpose

実行例:

行数を入力してください: 3
列数を入力してください: 3
行列要素を入力してください:
要素 [0][0] を入力してください: 1
要素 [0][1] を入力してください: 2
要素 [0][2] を入力してください: 3
要素 [1][0] を入力してください: 4
要素 [1][1] を入力してください: 5
要素 [1][2] を入力してください: 6
要素 [2][0] を入力してください: 7
要素 [2][1] を入力してください: 8
要素 [2][2] を入力してください: 9

元の行列:
1 2 3
4 5 6
7 8 9

コードの重要な部分を解説します。

  • MAX_ROWSMAX_COLS を使用して、行列の最大サイズを定義しています。
  • scanf() を使用して、ユーザーからの行数、列数、および行列要素の入力を取得しています。
  • ネストされたループを使用して、行列要素を入力および表示しています。
  • プログラムは、許可された最大行列サイズ内で入力値を検証しています。

行と列の交換

このステップでは、行列の行と列を入れ替えることで行列を転置する方法を学びます。前のプログラムを修正して、転置行列を作成します。

既存のmatrix_transpose.cファイルを開きます。

cd ~/project
nano matrix_transpose.c

以前のコードを以下の実装に置き換えます。

#include <stdio.h>

#define MAX_ROWS 100
#define MAX_COLS 100

int main() {
    int rows, cols;
    int matrix[MAX_ROWS][MAX_COLS];
    int transposed[MAX_COLS][MAX_ROWS];

    // 行列の次元を読み込む
    printf("行数を入力してください:");
    scanf("%d", &rows);

    printf("列数を入力してください:");
    scanf("%d", &cols);

    // 行列要素を入力
    printf("行列要素を入力してください:\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("要素 [%d][%d] を入力してください:", i, j);
            scanf("%d", &matrix[i][j]);
        }
    }

    // 行列を転置する
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            transposed[j][i] = matrix[i][j];
        }
    }

    // 元の行列を出力
    printf("\n元の行列:\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }

    // 転置行列を出力
    printf("\n転置行列:\n");
    for (int i = 0; i < cols; i++) {
        for (int j = 0; j < rows; j++) {
            printf("%d ", transposed[i][j]);
        }
        printf("\n");
    }

    return 0;
}

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

gcc matrix_transpose.c -o matrix_transpose
./matrix_transpose

実行例:

行数を入力してください: 3
列数を入力してください: 3
行列要素を入力してください:
要素 [0][0] を入力してください: 1
要素 [0][1] を入力してください: 2
要素 [0][2] を入力してください: 3
要素 [1][0] を入力してください: 4
要素 [1][1] を入力してください: 5
要素 [1][2] を入力してください: 6
要素 [2][0] を入力してください: 7
要素 [2][1] を入力してください: 8
要素 [2][2] を入力してください: 9

元の行列:
1 2 3
4 5 6
7 8 9

転置行列:
1 4 7
2 5 8
3 6 9

行列転置に関する重要な点:

  • 新しい行列transposedを、元の行列の次元の入れ替えで作成します。
  • 転置は、行と列を入れ替えることで行われます。
  • transposed[j][i] = matrix[i][j]が重要な変換です。
  • 元の行列と転置行列の次元は逆になります。

転置行列の出力

この最終ステップでは、読みやすさとエラー処理を向上させたフォーマットで転置行列を出力する方法を学びます。前のプログラムを強化して、よりプロフェッショナルな出力にします。

matrix_transpose.c ファイルを開きます。

cd ~/project
nano matrix_transpose.c

以前のコードを以下の改良された実装に置き換えます。

#include <stdio.h>

#define MAX_ROWS 100
#define MAX_COLS 100

void printMatrix(int matrix[MAX_ROWS][MAX_COLS], int rows, int cols, const char* title) {
    printf("%s:\n", title);
    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 matrix[MAX_ROWS][MAX_COLS];
    int transposed[MAX_COLS][MAX_ROWS];

    // 入力検証
    do {
        printf("行数を入力してください (1-%d): ", MAX_ROWS);
        scanf("%d", &rows);
    } while (rows <= 0 || rows > MAX_ROWS);

    do {
        printf("列数を入力してください (1-%d): ", MAX_COLS);
        scanf("%d", &cols);
    } while (cols <= 0 || cols > MAX_COLS);

    // 行列要素を入力
    printf("行列要素を入力してください:\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("要素 [%d][%d] を入力してください:", i, j);
            scanf("%d", &matrix[i][j]);
        }
    }

    // 行列を転置する
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            transposed[j][i] = matrix[i][j];
        }
    }

    // フォーマットされた出力で行列を出力
    printMatrix(matrix, rows, cols, "元の行列");
    printMatrix(transposed, cols, rows, "転置行列");

    return 0;
}

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

gcc matrix_transpose.c -o matrix_transpose
./matrix_transpose

実行例:

行数を入力してください (1-100): 3
列数を入力してください (1-100): 3
行列要素を入力してください:
要素 [0][0] を入力してください: 1
要素 [0][1] を入力してください: 2
要素 [0][2] を入力してください: 3
要素 [1][0] を入力してください: 4
要素 [1][1] を入力してください: 5
要素 [1][2] を入力してください: 6
要素 [2][0] を入力してください: 7
要素 [2][1] を入力してください: 8
要素 [2][2] を入力してください: 9

元の行列:
   1    2    3
   4    5    6
   7    8    9

転置行列:
   1    4    7
   2    5    8
   3    6    9

今回のバージョンで改善された点:

  • 行列の次元に対する入力検証を追加しました。
  • より良いコード構造のために、printMatrix() 関数を別途作成しました。
  • %4d を使用して、整数の表示を揃え、行列の出力のフォーマットを改善しました。
  • 行列出力にタイトルを追加して、分かりやすくしました。
  • より頑健に、様々なサイズの行列に対応できるようになりました。

まとめ

この実験では、C プログラムで行列の次元と要素を読み込み、行と列を入れ替えて転置行列を出力する方法を学びます。最初に、プログラムはユーザーに行数と列数を入力するように求め、次にユーザーに行列要素を入力させます。その後、元の行列が表示されます。次に、プログラムは行と列を入れ替えて行列の転置を計算し、最後に転置行列を出力します。

この実験で学ぶ重要な点は、scanf() を使用してユーザー入力を読み込むこと、入れ子になったループを使用して行列要素を入力および表示すること、および行と列を入れ替えることで転置操作を実行することです。また、プログラムは printf() を使用して元の行列と転置行列を表示する方法も示しています。