1

さて、私は行列の乗算を行っており、m x n配列と配列を作成する必要がありp x qます。
しかし、方法がわかりません。

これは、値を手動で入力したときに正しい出力を出力する私のプログラムです。

#include <stdio.h>
#include <stdlib.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[]) {
    /*
        Rows and columns for matrices.
    */
    int m , n; // rows and columns of the first matrix
    int p , q; // rows and columns of the second matrix

    /*
        1st matrix is a 2x3 matrix
    */
    m = 2;
    n = 3;

    /*
        2nd matrix is a 3x2 matrix
    */
    p = 3;
    q = 2;


    /*
        Create the matrices.
        Give them values.
    */
    int matrix1[m][n] = {
                            {2,3,4},
                            {5,6,7}
                        };
    int matrix2[p][q] = {
                            {1,7},
                            {3,9},
                            {5,11}
                        };

    /*
        Check if we can multiple the matrices.
        For matrix multiplication,
        the number of COLUMNS of FIRST matrix must be equal to
        the number of ROWS of SECOND matrix
    */
    if(n==p){
        /*
            Create a new matrix.
            The resulting matrix will have M rows and Q columns.
            That is, the matrix is a MxQ matrix.
        */
        int matrix3[2][2]; 

        /*
            We need three loops so we have 3 variables.
        */
        int i = 0; // iterates over matrix1 rows
        int j = 0; // iterates over matrix1 columns
        int k = 0; // iterates over matrix2 rows
        int l = 0; // iterates over matrix2 columns


        while(i < m){
            l = 0;
            while(l < q){
                int element = 0;
                while(j < n && k < p){
                    element += matrix1[i][j] * matrix2[k][l];
                    matrix3[i][l] = element;
                    j++;
                    k++;
                }
                printf("\t%d",element);
                l++;
                j = 0;
                k = 0;
            }
            printf("\n");
            i++;
        }

    }else{
        printf("Matrices can not be multiplied");
    }
}  

行列の宣言は、エラーとしてフラグが立てられます。どうすれば解決できますか?

4

3 に答える 3

3

どうすれば解決できますか?

まず、VLA を使用しないことです。この特定のタスクには VLA は必要ありません。

実際の問題については、可変長配列を初期化できません。それらの要素に 1 つずつ割り当てるか、memcpy().

于 2013-09-21T19:48:52.650 に答える
1

C99を使用するオプションはありますか?

可変長配列

これは C99 で 100% 有効です。

  int m = 2;
  int n = 3;

  int matrix1[m][n];
于 2013-09-21T19:48:21.293 に答える
1

「ネイティブ」可変長配列は、現在の c 標準によると、オプションの言語構造です。使用しているコンパイラが可変長配列をサポートしているかどうかを判断するには、コンパイラのドキュメントを確認する必要があります。

C99 より前の可変長配列は、明示的にヒープに割り当て、ポインターを介してアクセスする必要がありました。行列の問題には、2 つのオプションがあります。

1 つ目は、十分なストレージを備えた配列を割り当て、行列要素の読み取りまたは変更が必要なときに正しいインデックスを計算することです。例えば:

int* matrix_storage = malloc( sizeof( int ) * matrix_width * matrix_height );
// set row 0, column 1 to 0
matrix_storage[ ( 0 * matrix_width ) + ( 1 % matrix_width ) ] = 0; 

または、各行または列にポインターの配列を割り当てることができます。

int** rows = malloc( sizeof( (int*) ) * matrix_height );
for( int i = 0; i < matrix_height; ++i )
{
    rows[i] = malloc( sizeof(int) * matrix_width );
}
row[0][1] = 0; // set row 0, column 1 to 0

この実装は、選択した実装に関係なく、一部のメモリを浪費します。関数とstructキーワードを使用して、ドライバー コード (実際に行列を変更または読み取るコード) から実装を隠すことを検討してください。

いくつかの注意: 私は c99forループ構文を使用しました。古いコンパイラでは、int i変数をループの外で宣言する必要がありforます。また、コンパイル時に行列サイズを決定できる場合 (IE はユーザー入力に依存しない)、malloc のオーバーヘッドは必要なく、配列サイズをハードコーディングできることにも注意してください。投稿したコード例では、動的割り当ては必要ありません。

于 2013-09-21T20:06:18.730 に答える