如何在C中创建带浮点数的矩阵

时间:2017-03-14 22:57:13

标签: c

我正在阅读一个包含矩阵的文本文件,并试图将所述矩阵保存在矩阵中,但我相信我没有正确地执行它,因为当我编译程序时我得到错误下标值既不是数组也不是指针也不是矢量。这是代码( n_rows n_cols 是矩阵的列数和行数):

float kernel[n_rows];
float aux;
for (int i = 0; i < n_rows; i++){
    float row[n_cols];
    for (int j = 0; j < n_cols; j++){
        fscanf(f, "%f", &aux);
        row[j] = aux;
    kernel[i] = *row;
    }
}
for (int i = 0; i < n_rows; i++){
    for (int j = 0; j < n_cols; j++){
        printf("%f ", kernel[i][j]);
    }
    printf("\n");
}

它出现在 printf 部分,所以我的矩阵没有正确排列。这样做的正确方法是什么?

3 个答案:

答案 0 :(得分:4)

您需要按如下方式修改代码:

  • kernel指针数组 - 这将解决您看到的编译问题
  • 动态分配每行 - 这将解决为行使用临时内存的问题
  • 在嵌套循环之外进行分配 - 这将解决效率较低的问题。

以下是解决问题的一种方法:

float *kernel[n_rows];
for (int i = 0; i < n_rows; i++){
    float *row = malloc(sizeof(float)*n_cols);
    for (int j = 0; j < n_cols; j++){
        fscanf(f, "%f", &row[j]);
    }
    kernel[i] = row;
}

答案 1 :(得分:3)

您将矩阵kernel创建为一维数组。你真的想要一个2D数组(float kernel[n_rows][n_cols])。

请注意,您仍然需要更改行填充代码才能使其正常工作:

float *row = kernel[i];
for (int j = 0; j < n_cols; j++){
    fscanf(f, "%f", &aux);
    row[j] = aux;
}

答案 2 :(得分:0)

如果您提前知道n_rows和n_cols,那么将内核定义为:     内核[n_rows] [n_cols];

如上所述,你的行[n_cols]定义在堆栈上,所以当你可以填充一行时,kernel [i]的值将设置为指向这个基于堆栈的数组,并且每个都会被破坏通过循环的时间。

通过定义二维内核,可以避免这种情况。

float kernel[n_rows][n_cols];
for (int i = 0; i < n_rows; i++){
    for (int j = 0; j < n_cols; j++){
        fscanf(f, "%f", &kernel[i][j]);
    }
}
for (int i = 0; i < n_rows; i++){
    for (int j = 0; j < n_cols; j++){
        printf("%f ", kernel[i][j]);
    }
    printf("\n");
}

如果您事先不知道n_rows和n_cols,那么一旦确定n_rows,就需要malloc一个n_rows行指针数组。然后循环每一行,malloc为每一行浮点数组并指向它,如@dasblinkenlight所示