/* 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);
答案 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");
}
}