【C言語】ポインタを使って任意の行列の積を求める

この記事では、C言語を使って行列の表現方法と行列の積を求めるアルゴリズムについて解説します。

初心者の方でもわかりやすく、具体的なコード例を交えて説明します。

行列の表現方法や行列の積を求める方法について知りたい方は、ぜひ読んでみてください。

目次から探す

行列の表現方法

行列は、数値の2次元配列として表現することができます。

C言語では、2次元配列を使って行列を表現する方法が一般的です。

以下に、2次元配列を使った行列の表現方法を紹介します。

2次元配列を使った表現方法

2次元配列を使って行列を表現する場合、行と列のインデックスを使って要素にアクセスします。

例えば、3行3列の行列を表現する場合、以下のように2次元配列を宣言します。

int matrix[3][3];

この場合、matrix[0][0]は行列の左上の要素を表し、matrix[2][2]は行列の右下の要素を表します。

要素に値を代入するには、代入演算子を使います。

matrix[0][0] = 1;
matrix[0][1] = 2;
matrix[0][2] = 3;
// 以下、要素の代入を続ける

ポインタを使った表現方法

ポインタを使って行列を表現する場合、1次元配列を使います。

行列の要素は、1次元配列の連続したメモリ領域に格納されます。

以下に、ポインタを使った行列の表現方法を紹介します。

int *matrix;

この場合、matrixは行列の先頭要素を指すポインタとなります。

行列の要素にアクセスするには、ポインタの算術演算を使います。

matrix[0] = 1;
matrix[1] = 2;
matrix[2] = 3;
// 以下、要素の代入を続ける

ポインタを使った表現方法では、行列の要素を1次元配列として扱うため、メモリの効率的な利用が可能となります。

※2次元配列を使った表現方法では、行列の要素へのアクセスが直感的であり、コードの可読性が高いです。

一方、ポインタを使った表現方法では、メモリの効率的な利用ができるため、大規模な行列の計算に適しています。

どちらの表現方法を選ぶかは、使用する環境や目的によって異なります。

行列の積を求めるアルゴリズム

行列の積を求めるためには、いくつかのアルゴリズムがあります。

ここでは、ネストされたループを使った方法とポインタを使った方法について説明します。

ネストされたループを使った方法

ネストされたループを使った方法は、行列の要素を一つずつ取り出して計算する方法です。

以下に、具体的なコード例を示します。

#include <stdio.h>
#define ROW_A 2
#define COL_A 3
#define ROW_B 3
#define COL_B 2
void matrix_multiply(int A[ROW_A][COL_A], int B[ROW_B][COL_B], int C[ROW_A][COL_B]) {
    int i, j, k;
    for (i = 0; i < ROW_A; i++) {
        for (j = 0; j < COL_B; j++) {
            C[i][j] = 0;
            for (k = 0; k < COL_A; k++) {
                C[i][j] += A[i][k] * B[k][j];
            }
        }
    }
}
int main() {
    int A[ROW_A][COL_A] = {{1, 2, 3}, {4, 5, 6}};
    int B[ROW_B][COL_B] = {{7, 8}, {9, 10}, {11, 12}};
    int C[ROW_A][COL_B];
    matrix_multiply(A, B, C);
    printf("行列Aと行列Bの積は以下の通りです。\n");
    for (int i = 0; i < ROW_A; i++) {
        for (int j = 0; j < COL_B; j++) {
            printf("%d ", C[i][j]);
        }
        printf("\n");
    }
    return 0;
}

上記のコードでは、matrix_multiply関数を定義しています。

この関数は、行列Aと行列Bの積を計算し、結果を行列Cに格納します。

ネストされたループを使って、行列の要素を一つずつ取り出して計算しています。

ポインタを使った方法

ポインタを使った方法では、行列の要素をポインタを介してアクセスします。

以下に、具体的なコード例を示します。

#include <stdio.h>
#define ROW_A 2
#define COL_A 3
#define ROW_B 3
#define COL_B 2
void matrix_multiply(int *A, int *B, int *C, int row_A, int col_A, int col_B) {
    int i, j, k;
    for (i = 0; i < row_A; i++) {
        for (j = 0; j < col_B; j++) {
            *(C + i * col_B + j) = 0;
            for (k = 0; k < col_A; k++) {
                *(C + i * col_B + j) += *(A + i * col_A + k) * *(B + k * col_B + j);
            }
        }
    }
}
int main() {
    int A[ROW_A][COL_A] = {{1, 2, 3}, {4, 5, 6}};
    int B[ROW_B][COL_B] = {{7, 8}, {9, 10}, {11, 12}};
    int C[ROW_A][COL_B];
    matrix_multiply((int *)A, (int *)B, (int *)C, ROW_A, COL_A, COL_B);
    printf("行列Aと行列Bの積は以下の通りです。\n");
    for (int i = 0; i < ROW_A; i++) {
        for (int j = 0; j < COL_B; j++) {
            printf("%d ", C[i][j]);
        }
        printf("\n");
    }
    return 0;
}

上記のコードでは、matrix_multiply関数を定義しています。

この関数は、行列Aと行列Bの積を計算し、結果を行列Cに格納します。

ポインタを使って、行列の要素にアクセスして計算しています。

以上が、行列の積を求めるためのネストされたループを使った方法とポインタを使った方法の説明です。

目次から探す