方法1: 2次元配列を使用した転置
#include <stdio.h>
#define ROWS 3
#define COLS 3
void transposeMatrix(int matrix[ROWS][COLS], int result[COLS][ROWS]) {
int i, j;
for (i = 0; i < ROWS; i++) {
for (j = 0; j < COLS; j++) {
result[j][i] = matrix[i][j];
}
}
}
int main() {
int matrix[ROWS][COLS] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
int result[COLS][ROWS];
int i, j;
transposeMatrix(matrix, result);
printf("Original Matrix:\n");
for (i = 0; i < ROWS; i++) {
for (j = 0; j < COLS; j++) {
printf("%d ", matrix[i][j]);
}
printf("\n");
}
printf("\nTransposed Matrix:\n");
for (i = 0; i < COLS; i++) {
for (j = 0; j < ROWS; j++) {
printf("%d ", result[i][j]);
}
printf("\n");
}
return 0;
}
方法2: ポインタを使用した転置
#include <stdio.h>
#define ROWS 3
#define COLS 3
void transposeMatrix(int *matrix, int *result, int rows, int cols) {
int i, j;
for (i = 0; i < rows; i++) {
for (j = 0; j < cols; j++) {
*(result + j * rows + i) = *(matrix + i * cols + j);
}
}
}
int main() {
int matrix[ROWS][COLS] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
int result[COLS][ROWS];
int i, j;
transposeMatrix((int *)matrix, (int *)result, ROWS, COLS);
printf("Original Matrix:\n");
for (i = 0; i < ROWS; i++) {
for (j = 0; j < COLS; j++) {
printf("%d ", matrix[i][j]);
}
printf("\n");
}
printf("\nTransposed Matrix:\n");
for (i = 0; i < COLS; i++) {
for (j = 0; j < ROWS; j++) {
printf("%d ", result[i][j]);
}
printf("\n");
}
return 0;
}
方法3: 動的なメモリ割り当てを使用した転置
#include <stdio.h>
#include <stdlib.h>
void transposeMatrix(int matrix, int result, int rows, int cols) {
int i, j;
for (i = 0; i < rows; i++) {
for (j = 0; j < cols; j++) {
result[j][i] = matrix[i][j];
}
}
}
int main() {
int matrix, result;
int rows = 3;
int cols = 3;
int i, j;
// 行列のメモリ割り当て
matrix = (int )malloc(rows * sizeof(int *));
result = (int )malloc(cols * sizeof(int *));
for (i = 0; i < rows; i++) {
matrix[i] = (int *)malloc(cols * sizeof(int));
result[i] = (int *)malloc(rows * sizeof(int));
}
// 行列の初期化
matrix[0][0] = 1;
matrix[0][1] = 2;
matrix[0][2] = 3;
matrix[1][0] = 申し訳ありません、先ほどの方法3のコード例は途中で切れてしまいました。以下に完全なコード例を示します。
```c
#include <stdio.h>
#include <stdlib.h>
void transposeMatrix(int matrix, int result, int rows, int cols) {
int i, j;
for (i = 0; i < rows; i++) {
for (j = 0; j < cols; j++) {
result[j][i] = matrix[i][j];
}
}
}
int main() {
int matrix, result;
int rows = 3;
int cols = 3;
int i, j;
// 行列のメモリ割り当て
matrix = (int )malloc(rows * sizeof(int *));
result = (int )malloc(cols * sizeof(int *));
for (i = 0; i < rows; i++) {
matrix[i] = (int *)malloc(cols * sizeof(int));
result[i] = (int *)malloc(rows * sizeof(int));
}
// 行列の初期化
matrix[0][0] = 1;
matrix[0][1] = 2;
matrix[0][2] = 3;
matrix[1][0] = 4;
matrix[1][1] = 5;
matrix[1][2] = 6;
matrix[2][0] = 7;
matrix[2][1] = 8;
matrix[2][2] = 9;
transposeMatrix(matrix, result, rows, cols);
printf("Original Matrix:\n");
for (i = 0; i < rows; i++) {
for (j = 0; j < cols; j++) {
printf("%d ", matrix[i][j]);
}
printf("\n");
}
printf("\nTransposed Matrix:\n");
for (i = 0; i < cols; i++) {
for (j = 0; j < rows; j++) {
printf("%d ", result[i][j]);
}
printf("\n");
}
// メモリの解放
for (i = 0; i < rows; i++) {
free(matrix[i]);
}
free(matrix);
for (i = 0; i < cols; i++) {
free(result[i]);
}
free(result);
return 0;
}
この3つの方法は、C言語で行列の転置を行う一般的なアプローチです。それぞれの方法では、2次元配列、ポインタ、動的なメモリ割り当てを使用しています。これらの方法を使って、行列の転置を実装することができます。