Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C言語で行列の転置を計算する方法!初心者向けサンプルコード2選

行列の転置とは?

行列の転置(てんち)とは、元の行列の行と列を入れ替えた新しい行列のことです。たとえば、行列Aと行列Bがあったとき、Bの各行がAの対応する列と一致していれば、BはAの転置行列であるといえます。数学では A の転置を A^T のように表記します。

m×n の行列を転置すると、n×m の行列になります。C言語では、m(i,j) の位置にある要素を m(j,i) へ移すことで転置を実現できます。その基本ロジックは以下の通りです。

for (i = 0; i < m; i++)
    for (j = 0; j < n; j++)
        transpose[j][i] = matrix[i][j];

ポイントは、代入先の添字を逆にしている点です。matrix[i][j] の値を transpose[j][i] に格納することで、行と列が自然に入れ替わります。

プログラム1:forループで転置を求める

最初の例では、forループを使って行列の行数・列数と各要素をキーボードから入力し、その転置行列を画面に出力します。

#include <stdio.h>
int main(){
    int m, n, i, j, matrix[10][10], transpose[10][10];
    printf("Enter rows and columns :\n");
    scanf("%d%d", &m, &n);
    printf("Enter elements of the matrix\n");
    for (i = 0; i < m; i++)
        for (j = 0; j < n; j++)
            scanf("%d", &matrix[i][j]);
    for (i = 0; i < m; i++)
        for (j = 0; j < n; j++)
            transpose[j][i] = matrix[i][j];
    printf("Transpose of the matrix:\n");
    for (i = 0; i < n; i++) {
        for (j = 0; j < m; j++)
            printf("%d\t", transpose[i][j]);
        printf("\n");
    }
    return 0;
}

実行結果

Enter rows and columns :
2 3
Enter elements of the matrix
1 2 3
2 4 5
Transpose of the matrix:
1     2
2     4
3     5

この例では、2行3列の行列を入力すると、3行2列の転置行列が出力されます。元の行列の1行目「1 2 3」が、転置後の1列目に移っていることを確認できます。

プログラム2:#defineでサイズを固定する方法

2つ目のプログラムでは、#define を使って行数(ROW)と列数(COL)をコンパイル時に定義しています。行列のサイズがあらかじめ決まっている場合は、この方法のほうがコードがシンプルになり、可読性も向上します。

#include <stdio.h>
#define ROW 2
#define COL 5
int main(){
    int i, j, mat[ROW][COL], trans[COL][ROW];
    printf("Enter matrix: \n");
    /* 行列の入力 */
    for(i = 0; i < ROW; i++){
        for(j = 0; j < COL; j++){
            scanf("%d", &mat[i][j]);
        }
    }
    /* 転置行列の作成 */
    for(i = 0; i < ROW; i++){
        for(j = 0; j < COL; j++){
            trans[j][i] = mat[i][j];
        }
    }
    printf("\nTranspose matrix: \n");
    /* 転置行列の出力 */
    for(i = 0; i < COL; i++){
        for(j = 0; j < ROW; j++){
            printf("%d ", trans[i][j]);
        }
        printf("\n");
    }
    return 0;
}

実行結果

Enter matrix:
1 2 3 4 5
5 4 3 2 1

Transpose matrix:
1 5
2 4
3 3
4 2
5 1

2行5列の行列を入力すると、5行2列の転置行列が得られます。転置後の出力では、外側のループを COL 回、内側のループを ROW 回繰り返す点に注意してください。行と列の数が入れ替わっているためです。

まとめ

C言語で行列の転置を計算する際のポイントは、次の2点です。

  • 添字の入れ替え:「transpose[j][i] = matrix[i][j];」のように、代入元と代入先の行・列を逆にするだけで転置が実現できます。
  • 出力時のループ範囲:転置後は行数と列数が入れ替わるため、出力用の二重ループの上限値も入れ替える必要があります。

サイズが動的に変わる場合はプログラム1のようにユーザー入力から取得し、固定サイズでよい場合はプログラム2のように #define を活用すると、より読みやすいコードになります。

  1. Pythonでグラフの頂点間の到達可能性行列を計算するプログラム

    隣接リスト形式で表現されたグラフが与えられたとき、次のような条件を満たす2次元行列Mを求めることを考えます。M[i, j] = 1:頂点iから頂点jへの経路(パス)が存在する場合M[i, j] = 0:経路が存在しない場合例えば、次のようなグラフが入力として与えられたとします。この場合の出力は、以下の5×5の行列になります。1111101111011110111101111解法のアプローチこの問題は、各頂点を起点とした幅優先探索(BFS)を用いることで効率的に解くことができます。具体的な手順は以下の通りです。n×nの2次元行列「ans」を作成し、すべての要素を0で初期化します(nは頂点の総数)

  2. Pythonで行列の転置を求めるプログラム

    この記事では、与えられた問題に対する解法とアプローチについて詳しく解説します。 問題文 ある行列が与えられたとき、その転置を同じ行列に格納し、結果を表示する必要があります。 行列の転置とは、行を列に、列を行に入れ替えたものです。言い換えれば、行列Aの転置は、要素A[i][j]をA[j][i]と入れ替えることで得られます。 実装例 N = 4 def transpose(A): for i in range(N): for j in range(i+1, N): A[i][j], A[j][i] = A[j][i], A[i][j] # ドライ