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

我的意思是,看起来一个循环被用来在一维中遍历 N*N 个元素。这在 C 中是否可能,而不需要另一个循环来循环遍历列?

编辑:

初始化二维数组并调用此函数的代码如下所示:

  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

如果您只想将它​​们全部设置为某个初始值,那么可以,使用单个 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 中工作(最后我检查过,无论如何)。

于 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是一维数组。有时,人们会通过将每一行分配给一维数组的一部分来使用一维数组来代替二维数组(为了稍微提高速度)。我不建议这样做,因为它会损害可读性,而且速度提升也不是微不足道的。

于 2012-11-17T18:40:57.273 回答
0

这个示例程序告诉你使用一维数组作为二维数组的方法

#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 回答