0
/* Initialize matrix with values from 0 to N*N.  */
void
init_matrix_seq (unsigned N, float * m)
{
    unsigned i;

    for (i = 0; i < N*N; ++i)
        m[i] = (float) i;
}

つまり、1 次元で N*N 要素を処理するために 1 つのループが使用されているように見えます。列を循環する別のループを必要とせずに、これは C で可能ですか?

編集:

2D 配列を初期化し、この関数を呼び出すコードを次に示します。

  A = (float *) malloc (N * N * sizeof (float));
  B = (float *) malloc (N * N * sizeof (float));

  init_matrix (N, A, 1.0);
  init_matrix (N, B, 1.0);
4

4 に答える 4

2

それらを ALL に初期値に設定することだけが必要な場合は、はい、次のように単一の 1D インデックスを使用します。

void init_matrix(unsigned N, float m[], float init_val)
{
    unsigned i;
    for (i = 0; i < N*N; ++i)
        m[i] = init_val;
}

あなたの順次初期化は、あなたの質問とまったく同じです:

void init_matrix_seq(unsigned N, float m[])
{
    unsigned i;
    for (i = 0; i < N*N; ++i)
        m[i] = i;
}

位置をヒットする必要がある特定の値がある場合m[i][j]、C では、次の方法で正式な行幅でアクセスできます。

void init_matrix_seq (unsigned N, float m[][N])
{
    unsigned i,j;

    for (i = 0; i < N; ++i)
        for (j = 0; j < N; ++j)
        {
            m[i][j] = i*j; // <<your initial value here>>;
        }
}

単一の線形配列としてアクセスしたい場合は、確かにアクセスできます。以下は、上記と同じ結果を達成します (同じ仮定で、これは N*N float 幅です)。

void init_matrix_seq (unsigned N, float m[])
{
    unsigned i,j;

    for (i = 0; i < N; ++i)
        for (j = 0; j < N; ++j)
        {
            m[i*N+j] = i*j; // <<your initial value here>>;
        }
}

後者の例は、C および C++ で動作する優れた機能を備えています。前者は C でのみ動作します (最後に確認しました)。

于 2012-11-17T18:49:58.057 に答える
2

答えはイエスですが、二重インデックスを使用することはできず、要素にインデックスを付けたい場合は、A[i][j] の代わりに A[i*N+j] を呼び出す必要があるため、問題が発生する可能性があります。
二重インデックスを使用してこれを行い、メモリ内ですべてを隣接させたい場合は、次の方法で配列を割り当てます。

float (*A) [N]= (float (*)[N] ) malloc(N*sizeof(float[N]) );

これで、メモリ内にすべて隣接するようになりました。作成した関数を使用できます。ただし、二重インデックスを使用することもできます。

for(int i=0; i<N; i++)
    for(int j=0; j<N; j++)
        A[i][j]=i*N+j;

しかし、あなたの方法は正しいです。

于 2012-11-17T18:59:27.777 に答える
0

あなたは正しいです; mは一次元配列です。場合によっては、各行を 1D 配列のセクションに割り当てることにより、2D 配列の代わりに 1D 配列を使用することがあります (わずかな速度向上のため)。読みやすさが損なわれ、速度の向上が些細なものではないため、これを行うことはお勧めしません。

于 2012-11-17T18:40:57.273 に答える
0

このサンプル プログラムでは、1 次元配列を 2 次元配列として使用する方法を説明します。

#include <stdio.h>
#define rows 4
#define cols 6

int main()
{
    int array1D[rows * cols] = 
         { 1, 2, 3, 4, 5, 6,
           7, 8, 9, 10, 11, 12,
           13, 14, 15, 16, 17, 18,
           19, 20, 21, 22, 23, 24 };

    int (*array2D)[cols] = (int (*)[cols]) array1D;
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%d ", array2D[i][j] );
        }
        printf("\n");
    }
 }
于 2012-11-17T18:48:34.580 に答える