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