1

以下の私のコードは問題なく動作します。ただし、マトリックスをヒープメモリに格納する方法を知りたいです。このコードは、ユーザーから 3 つの正の整数 a、b、および c を受け入れます。次に、ユーザーは 2 つの行列を入力します。最初の行列は n(行) x m(列) で、2 番目の行列は m(行) x p(列) です。

行列の積/出力は、n 行 x p 列です。 サンプル入力

4

3

2

14 9 3

2 11 15

0 12 17

5 2 3

12 25 9 10

8 5

サンプル出力

273 455

243 235

244 205

102 160

int main(void) {
    int row1, row2, col1, col2, i, j, e;
    int temp, **matrix1, **matrix2, **mtxProduct;

    scanf("%d", &row1);
    scanf("%d", &col1);

    temp = col1;
    row2=temp;    
    scanf("%d", &col2);

    if (col1 != row2) {
        printf("\nIncorrect combination!\n");
        return 1;
    }

    matrix1 = (int**) malloc(row1 * sizeof(int*));

    //read elements of 1st matrix
    for (i = 0; i < row1; i++) {
        matrix1[i] = (int*) malloc(col1 * sizeof (int));
        for (j = 0; j < col1; j++) {
            scanf("%d %d %d\n", &matrix1[i][j], &matrix1[i][j], &matrix1[i][j]);
        }
    }

    matrix2 = (int**) malloc(row2 * sizeof (int*));

    //read elements of 2nd matrix
    for (i = 0; i < row2; i++) {
        matrix2[i] = (int*) malloc(col2 * sizeof (int));
        for (j = 0; j < col2; j++) {
            scanf("%d %d %d", &matrix2[i][j], &matrix2[i][j], &matrix2[i][j]);
        }
    }

    mtxProduct = (int**) malloc(row1 * sizeof (int*));

    for (i = 0; i < col2; i++) {
        mtxProduct[i] = (int*) malloc(col2 * sizeof (int));
    }

    for (i = 0; i < row1; i++) {
        for (j = 0; j < col2; j++) {
            mtxProduct[i][j] = 0;
            for (e = 0; e < row2; e++) {
                mtxProduct[i][j] +=(matrix1[i][e] * matrix2[e][j]);
            }
        }
    }

    for (i = 0; i < row1; i++) {
        for (j = 0; j < col2; j++) {
            printf("%d ", mtxProduct[i][j]);
        }
    }
    return 0;
}
4

2 に答える 2

1

C99以降の最新のCコンパイラを使用している場合、次のイデオムが許可されるはずです

double (*A)[m] = malloc(sizeof(double[n][m]));

そのようなものは「可変的に変更された型」と呼ばれ、必要なサイズを運ぶため、コンパイラーはA[i][j]それ自体で解決できます。

あなたが純粋主義者なら、次のこともできます:

double (*A)[n][m] = malloc(sizeof *A);

*のようなものを自分で持ち歩きます(*A)[i][j]

freeまた、不要になった場合は最後のスペースを忘れないでfree(A)ください。どちらの場合もそうする必要があります。

于 2012-08-30T09:56:09.537 に答える
0

他の回答者が言ったように、使用する必要がありますmalloc。あなたの行列のエントリは、int

int * allocate_matrix(int m, int n) {
  /* Returns an allocated m x n matrix */
  return malloc(sizeof(int) * m * n);
}

行列にアクセスするには、列優先形式と行優先形式のどちらを使用するかを決定する必要があります。列優先形式 (FORTRAN によって促進され、科学的プログラミングで最も一般的) では、各列を連続して次々に格納します。(2,3) のエントリにアクセスするには、行列へのポインタ (たとえば ) を取得し、Aそれを wrt で逆参照し2*(number of columns) + 1ます。したがって、mxn 行列の場合はA[1+2*n]、0 インデックスを考慮して行番号と列番号を 1 つ取ります。

この種のことをしたいのなら、それは本当にクールで、正直なところです - Google BLAS.

于 2012-08-30T10:11:29.900 に答える