我正在阅读一个包含矩阵的文本文件,并试图将所述矩阵保存在矩阵中,但我相信我没有正确地执行它,因为当我编译程序时我得到错误下标值既不是数组也不是指针也不是矢量。这是代码( 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 部分,所以我的矩阵没有正确排列。这样做的正确方法是什么?
答案 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所示