Repository navigation
Expand file tree
/
Copy pathmatrix_read.cc
More file actions
104 lines (80 loc) · 1.83 KB
/
Copy pathmatrix_read.cc
File metadata and controls
104 lines (80 loc) · 1.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include "error.h"
#include "file.h"
#include "matrix.h"
#include "mmio.h"
#include "types.h"
#include <stdio.h>
#include <stdlib.h>
matrix_t*
matrix_read_array(FILE *f)
{
int m, n, result;
uint i, j;
matrix_t *mr;
if (0 != (result = mm_read_matrix_array_size(f, &m, &n))) {
die("Failed to read matrix size (%d).\n", result);
}
mr = matrix_malloc(m, n);
for (i = 0; i < mr->m; ++i) {
for (j = 0; j < mr->n; ++j) {
fscanf(f, "%lg\n", &mr->data[i][j]);
}
}
return mr;
}
matrix_t*
matrix_read_coordinate(FILE *f)
{
int m, n, nnz, result;
uint i, j;
double d;
matrix_t *mr;
if (0 != (result = mm_read_matrix_coordinate_size(f, &m, &n, &nnz))) {
die("Failed to read matrix size (%d).\n", result);
}
mr = matrix_malloc(m, n);
matrix_clear(mr);
while (nnz--) {
fscanf(f, "%u %u %lg\n", &i, &j, &d);
mr->data[i-1][j-1] = d; /* adjust from 1-based to 0-based */
}
return mr;
}
matrix_t*
matrix_fread_data(FILE *file, MM_typecode type)
{
matrix_t *mr;
debug("matrix_fread_data(file=0x%x, type='%s')\n",
file, mm_typecode_to_str(type));
if (!mm_is_matrix(type) || !mm_is_real(type)) {
die("No support for matrix type: [%s]\n", mm_typecode_to_str(type));
}
if (mm_is_array(type)) {
mr = matrix_read_array(file);
} else {
mr = matrix_read_coordinate(file);
}
mr->scheme = scheme::general;
if (mm_is_symmetric(type)) {
mr->scheme = scheme::symmetric;
}
return mr;
}
matrix_t*
matrix_fread(FILE *file)
{
MM_typecode type;
debug("matrix_fread(0x%x)\n", file);
datatype_read_typecode(file, &type);
return matrix_fread_data(file, type);
}
matrix_t*
matrix_read(char const *filename)
{
FILE *f;
matrix_t *t;
f = fopen_or_die(filename, "r");
t = matrix_fread(f);
fclose(f);
return t;
}