可以通过这种方式初始化2D阵列吗?

时间:2012-11-17 18:33:00

标签: c matrix

/* 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;
}

我的意思是,它看起来像是在一个维度中使用一个循环来遍历N * N个元素。这可能在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 个答案:

答案 0 :(得分: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浮动宽度相同)。

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(最后我检查过,无论如何)。

答案 1 :(得分: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;

但你的方法是正确的。

答案 2 :(得分:0)

你是对的; m是一维数组。有时,人们将使用一维数组代替二维数组(用于轻微的速度提升),方法是将每一行分配给一维数组的一部分。我不建议这样做,因为它会损害可读性并且速度增加不是那么简单。

答案 3 :(得分:0)

此示例程序告诉您将1D数组用作2D数组的方法

#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");
    }
 }