はじめに
この実験では、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_ROWSとMAX_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() を使用して元の行列と転置行列を表示する方法も示しています。



