如何在不知道其大小且无需多次读取的情况下从文件加载矩阵?

波顿

我的练习是从 2 个大小未知的文件中加载 2 个矩阵,并在可能的情况下将它们相乘。我还应该加载每个文件一次。我可以通过加载文件两次来做到这一点,如下所示,但是我怎么能只加载一次文件呢?

typedef struct matrix_ {
    int r, c;
    double* dat;
} matrix;

int rows(char* fn) {
    int lines = 1;
    int ch;
    FILE* fp = fopen(fn, "r");
    while(!feof(fp)) {
        ch = fgetc(fp);
        if(ch == '\n') {
            lines++;
        }
    }
    return lines;
}

matrix loadmatrix(char* fn) {
    FILE* file = fopen(fn, "r");
    int size = 5*5;
    matrix mat;
    mat.r = rows(fn);
    mat.dat = malloc(size*sizeof(double));
    double input;
    int i = 0;
    do {
        if (fscanf(file, "%lf", &input)==1) {
            if(i == size-1) {
                size = 4*size;
                mat.dat = realloc(mat.dat, size*sizeof(double));
            }
            mat.dat[i] = input;
            i+=1;
        }
    } while (!feof(file));
    mat.c = ((i+1)/(mat.r));
    return mat;
}
比利布朗

逐行读取文件,对于每一行,使用sscanf.

每行都是一行,其中的每个值都在列中。在第一行,边走边数列,并在每个换行符处计算行数。如果您的data数组中需要更多空间,请再realloc增加一行的空间 ( matrix.cols * sizeof(double))。

使用read_line在线路便携阅读,我们有:

#define MIN_SIZE (5 * 5)

typedef struct matrix {
    size_t  rows;
    size_t  cols;
    double *data;
} matrix;

matrix loadmatrix(const char *filename)
{
    FILE *file = fopen(filename, "r");
    if (file == NULL) {
        fprintf(stderr, "could not open file '%s' for reading\n", filename);
        exit(1);
    }
    matrix mat = {
        .rows = 0,
        .cols = 0,
        .data = calloc(MIN_SIZE, sizeof(double)),
    };
    // You should check mat.data != NULL here, but I omit it to ease reading
    char *line = NULL;
    size_t index = 0;
    size_t data_size = MIN_SIZE;
    while (read_line(file, &line) > 0) {
        double value;
        // Keep reading values into this row
        size_t offset = 0;
        int read_chars = 0;
        while (sscanf(line + offset, "%lf%n", &value, &read_chars) == 1) {
            offset += read_chars;
            if (mat.rows == 0) {
                ++mat.cols;
            }
            // Increase the size of the matrix by one more row if more space is needed
            if (index >= data_size) {
                data_size += mat.cols;
                mat.data = realloc(mat.data, sizeof(double) * data_size);
                if (mat.data == NULL) {
                    fprintf(stderr,
                        "could not allocate more space for matrix: %zu\n",
                        data_size);
                    exit(1);
                }
            }
            mat.data[index++] = value;
        }
        ++mat.rows;
        free(line);
    }
    return mat;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在不知道其长度的情况下从文件中读取2D数组?

来自分类Dev

如何在不知道大小的情况下绘制matlab中的所有矩阵元素?

来自分类Dev

如何在不知道输入大小的情况下读取输入?

来自分类Dev

如何在不知道其扩展名但又知道全名的情况下打开文件?

来自分类Dev

在不知道类型的情况下从文件中读取

来自分类Dev

如何在不知道原始数组大小的情况下增加动态数组(C ++)的大小?

来自分类Dev

如何在不知道其长度的情况下遍历char **

来自分类Dev

我如何在不知道图像ID的情况下更改其属性?

来自分类Dev

如何在不知道其确切类型的情况下更新DbContext中的实体?

来自分类Dev

如何在不知道输入类型的情况下创建填充矩阵的方法

来自分类Dev

如何在不知道数组大小的情况下复制二维数组

来自分类Dev

如何在不知道json键的情况下使用JsonReader从json读取值

来自分类Dev

如何在不知道变量名称的情况下读取查询字符串?

来自分类Dev

在Objectify中,如何在不知道父键的情况下通过ID加载实体?

来自分类Dev

如何在不知道bash扩展名的情况下提取各种zip文件

来自分类Dev

如何在不知道名称的情况下访问.mat文件中的“值”?

来自分类Dev

我可以在不知道动态数组大小的情况下对其进行迭代

来自分类Dev

EL如何在不知道其类的情况下与对象的方法和字段一起工作

来自分类Dev

如何在不知道其宽度的情况下将元素存储在2D向量中?

来自分类Dev

Selenium:如何在不知道其id或name属性的情况下找到网页上的所有图像?

来自分类Dev

如何在不知道其在Visual Studio中的位置的情况下使用SqlDataReader从选择中获取值

来自分类Dev

如何在不知道其命令行名称的情况下轻松分辨出其中的软件包?

来自分类Dev

在不知道大小的情况下打印数组

来自分类Dev

在不知道数组大小的情况下输入数组

来自分类Dev

在不知道大小的情况下寻找图标

来自分类Dev

在不知道文件名的情况下使用 Javascript Fetch API 读取文件

来自分类Dev

如何在不知道列表大小的情况下使用redis-cli打印列表中的所有值?

来自分类Dev

Powershell:如何在不知道子网大小的情况下扫描局域网

来自分类Dev

如何在不知道Perl中目录名称的情况下读取目录和子目录?

Related 相关文章

  1. 1

    如何在不知道其长度的情况下从文件中读取2D数组?

  2. 2

    如何在不知道大小的情况下绘制matlab中的所有矩阵元素?

  3. 3

    如何在不知道输入大小的情况下读取输入?

  4. 4

    如何在不知道其扩展名但又知道全名的情况下打开文件?

  5. 5

    在不知道类型的情况下从文件中读取

  6. 6

    如何在不知道原始数组大小的情况下增加动态数组(C ++)的大小?

  7. 7

    如何在不知道其长度的情况下遍历char **

  8. 8

    我如何在不知道图像ID的情况下更改其属性?

  9. 9

    如何在不知道其确切类型的情况下更新DbContext中的实体?

  10. 10

    如何在不知道输入类型的情况下创建填充矩阵的方法

  11. 11

    如何在不知道数组大小的情况下复制二维数组

  12. 12

    如何在不知道json键的情况下使用JsonReader从json读取值

  13. 13

    如何在不知道变量名称的情况下读取查询字符串?

  14. 14

    在Objectify中,如何在不知道父键的情况下通过ID加载实体?

  15. 15

    如何在不知道bash扩展名的情况下提取各种zip文件

  16. 16

    如何在不知道名称的情况下访问.mat文件中的“值”?

  17. 17

    我可以在不知道动态数组大小的情况下对其进行迭代

  18. 18

    EL如何在不知道其类的情况下与对象的方法和字段一起工作

  19. 19

    如何在不知道其宽度的情况下将元素存储在2D向量中?

  20. 20

    Selenium:如何在不知道其id或name属性的情况下找到网页上的所有图像?

  21. 21

    如何在不知道其在Visual Studio中的位置的情况下使用SqlDataReader从选择中获取值

  22. 22

    如何在不知道其命令行名称的情况下轻松分辨出其中的软件包?

  23. 23

    在不知道大小的情况下打印数组

  24. 24

    在不知道数组大小的情况下输入数组

  25. 25

    在不知道大小的情况下寻找图标

  26. 26

    在不知道文件名的情况下使用 Javascript Fetch API 读取文件

  27. 27

    如何在不知道列表大小的情况下使用redis-cli打印列表中的所有值?

  28. 28

    Powershell:如何在不知道子网大小的情况下扫描局域网

  29. 29

    如何在不知道Perl中目录名称的情况下读取目录和子目录?

热门标签

归档