C言語を使った行列の転置方法


方法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次元配列、ポインタ、動的なメモリ割り当てを使用しています。これらの方法を使って、行列の転置を実装することができます。