如何在C中的连续数组中存储2D数组?

时间:2018-04-11 20:22:55

标签: c

对于我的作业,我必须对数组进行数学运算,我正在从文本文件中读取。它必须动态分配,因为我们不知道矩阵的大小,虽然我们知道它将是square。所以我设法读取数组并且我已经输入代码以便它知道运行时的行和列。但我的教授希望我们使用连续的数组并像这样分配矩阵

float* A = (float*) malloc( n * m * sizeof(float) ); 

但我不知道如何读取文本文件中的值到这个数组中。我会做什么使用for循环或什么?我将如何在以后访问数组中的元素?

4 个答案:

答案 0 :(得分:5)

如果你必须"折叠"将二维矩阵变成一个平面"数组,使用教授建议的分配行(删除unnecessary cast后)并创建一对函数来访问矩阵:

float get(const float *m, size_t width, size_t r, size_t c) {
    return m[r*width+c];
}
void set(float *m, size_t width, size_t r, size_t c, float val) {
    m[r*width+c] = val;
}

注意:以上说明了在row-major order中打包矩阵;列主要顺序是另一种可能性。

答案 1 :(得分:1)

考虑分配旧式表格

float* A = (float*) malloc( n * m * sizeof(float) ); 

将数据读入其中

if (A) {
  for (size_t ni = 0; ni < n; ni++) {
    for (size_t mi = 0; mi < m; mi++) {
      if (fscanf(inf, "%f", A + ni*m + mi) != 1) Handle_Bad_Read();
      // or 
      if (fscanf(inf, "%f", &A[ni*m + mi]) != 1) Handle_Bad_Read();
    } 
  }

要打印

  for (size_t ni = 0; ni < n; ni++) {
    for (size_t mi = 0; mi < m; mi++) {
      printf(inf, " %g", A[ni*m + mi]);
    }
    putc('\n'); 
  }
}

答案 2 :(得分:1)

@dasblinkenlight的答案很好。只是详细说明你如何在自己的答案中找出数学:当我需要确定如何以数学方式表示两个量之间的关系时,我经常发现绘制图片很有帮助。在这种情况下,Excel是你的朋友。我将从一个具体的例子开始。例如,假设我有一个包含五行四列的数组。正如@dasblinkenlight所指出的,有两种明确的方法可以对这样的数组中的单元格进行编号:行主顺序或列主顺序。我会在我的具体示例中手动编号:

A specific example

然后我会看看我画的是什么并试图找出模式。在第一张图像中,您可以看到当您从一列移动到下一列时单元格数量增加一,而当您从一行移动到下一行时,单元格数量会增加四(列数)。在第二张图片中,情况正好相反。那么我将尝试编写一个包含M行和N列的通用示例:

Generalized

将我在突出显示的单元格中找到的内容与@ dasblinkenlight的代码进行比较。

你并不总是需要手工绘制所有东西以便推断答案 - 你作为开发人员积累的经验越多,你脑中看到这些模式就越容易 - 但这是一个有用的方法像这样的问题。

答案 3 :(得分:0)

你问题的第一部分有点不清楚。 至于第二部分,如果使用连续分配分配2D矩阵,则可以访问存储在其中的值,如:

 matrix[ i * <no_of_columns> + j]

其中“no_of_columns”是2D矩阵的宽度,对应于

 matrix[i][j] 

如果简单地说。