matio.h 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. /** @file matio.h
  2. * LIBMATIO Header
  3. * @ingroup MAT
  4. */
  5. /*
  6. * Copyright (c) 2015-2024, The matio contributors
  7. * Copyright (c) 2005-2014, Christopher C. Hulbert
  8. * All rights reserved.
  9. *
  10. * Redistribution and use in source and binary forms, with or without
  11. * modification, are permitted provided that the following conditions are met:
  12. *
  13. * 1. Redistributions of source code must retain the above copyright notice, this
  14. * list of conditions and the following disclaimer.
  15. *
  16. * 2. Redistributions in binary form must reproduce the above copyright notice,
  17. * this list of conditions and the following disclaimer in the documentation
  18. * and/or other materials provided with the distribution.
  19. *
  20. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  21. * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  22. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  23. * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  24. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  25. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  26. * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  27. * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  28. * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  29. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  30. */
  31. #ifndef MATIO_H
  32. #define MATIO_H
  33. #include "matio_pubconf.h"
  34. #include <stdlib.h>
  35. #include <stdio.h>
  36. #include <stdarg.h>
  37. #ifdef __cplusplus
  38. #define EXTERN extern "C"
  39. #else
  40. #define EXTERN extern
  41. #endif
  42. /** @defgroup MAT Matlab MAT File I/O Library */
  43. /** @defgroup mat_util MAT File I/O Utility Functions */
  44. /** @if mat_devman @defgroup mat_internal Internal Functions @endif */
  45. /** @brief MAT file access types
  46. *
  47. * @ingroup MAT
  48. * MAT file access types
  49. */
  50. enum mat_acc
  51. {
  52. MAT_ACC_RDONLY = 0, /**< @brief Read only file access */
  53. MAT_ACC_RDWR = 1 /**< @brief Read/Write file access */
  54. };
  55. /** @brief MAT file versions
  56. *
  57. * @ingroup MAT
  58. * MAT file versions
  59. */
  60. enum mat_ft
  61. {
  62. MAT_FT_MAT73 = 0x0200, /**< @brief Matlab version 7.3 file */
  63. MAT_FT_MAT5 = 0x0100, /**< @brief Matlab version 5 file */
  64. MAT_FT_MAT4 = 0x0010, /**< @brief Matlab version 4 file */
  65. MAT_FT_UNDEFINED = 0 /**< @brief Undefined version */
  66. };
  67. /** @brief Matlab data types
  68. *
  69. * @ingroup MAT
  70. * Matlab data types
  71. */
  72. enum matio_types
  73. {
  74. MAT_T_UNKNOWN = 0, /**< @brief UNKNOWN data type */
  75. MAT_T_INT8 = 1, /**< @brief 8-bit signed integer data type */
  76. MAT_T_UINT8 = 2, /**< @brief 8-bit unsigned integer data type */
  77. MAT_T_INT16 = 3, /**< @brief 16-bit signed integer data type */
  78. MAT_T_UINT16 = 4, /**< @brief 16-bit unsigned integer data type */
  79. MAT_T_INT32 = 5, /**< @brief 32-bit signed integer data type */
  80. MAT_T_UINT32 = 6, /**< @brief 32-bit unsigned integer data type */
  81. MAT_T_SINGLE = 7, /**< @brief IEEE 754 single precision data type */
  82. MAT_T_DOUBLE = 9, /**< @brief IEEE 754 double precision data type */
  83. MAT_T_INT64 = 12, /**< @brief 64-bit signed integer data type */
  84. MAT_T_UINT64 = 13, /**< @brief 64-bit unsigned integer data type */
  85. MAT_T_MATRIX = 14, /**< @brief matrix data type */
  86. MAT_T_COMPRESSED = 15, /**< @brief compressed data type */
  87. MAT_T_UTF8 = 16, /**< @brief 8-bit Unicode text data type */
  88. MAT_T_UTF16 = 17, /**< @brief 16-bit Unicode text data type */
  89. MAT_T_UTF32 = 18, /**< @brief 32-bit Unicode text data type */
  90. MAT_T_STRING = 20, /**< @brief String data type */
  91. MAT_T_CELL = 21, /**< @brief Cell array data type */
  92. MAT_T_STRUCT = 22, /**< @brief Structure data type */
  93. MAT_T_ARRAY = 23, /**< @brief Array data type */
  94. MAT_T_FUNCTION = 24 /**< @brief Function data type */
  95. };
  96. /** @brief Matlab variable classes
  97. *
  98. * @ingroup MAT
  99. * Matlab variable classes
  100. */
  101. enum matio_classes
  102. {
  103. MAT_C_EMPTY = 0, /**< @brief Empty array */
  104. MAT_C_CELL = 1, /**< @brief Matlab cell array class */
  105. MAT_C_STRUCT = 2, /**< @brief Matlab structure class */
  106. MAT_C_OBJECT = 3, /**< @brief Matlab object class */
  107. MAT_C_CHAR = 4, /**< @brief Matlab character array class */
  108. MAT_C_SPARSE = 5, /**< @brief Matlab sparse array class */
  109. MAT_C_DOUBLE = 6, /**< @brief Matlab double-precision class */
  110. MAT_C_SINGLE = 7, /**< @brief Matlab single-precision class */
  111. MAT_C_INT8 = 8, /**< @brief Matlab signed 8-bit integer class */
  112. MAT_C_UINT8 = 9, /**< @brief Matlab unsigned 8-bit integer class */
  113. MAT_C_INT16 = 10, /**< @brief Matlab signed 16-bit integer class */
  114. MAT_C_UINT16 = 11, /**< @brief Matlab unsigned 16-bit integer class */
  115. MAT_C_INT32 = 12, /**< @brief Matlab signed 32-bit integer class */
  116. MAT_C_UINT32 = 13, /**< @brief Matlab unsigned 32-bit integer class */
  117. MAT_C_INT64 = 14, /**< @brief Matlab signed 64-bit integer class */
  118. MAT_C_UINT64 = 15, /**< @brief Matlab unsigned 64-bit integer class */
  119. MAT_C_FUNCTION = 16, /**< @brief Matlab function class */
  120. MAT_C_OPAQUE = 17 /**< @brief Matlab opaque class */
  121. };
  122. /** @brief Matlab array flags
  123. *
  124. * @ingroup MAT
  125. * Matlab array flags
  126. */
  127. enum matio_flags
  128. {
  129. MAT_F_COMPLEX = 0x0800, /**< @brief Complex bit flag */
  130. MAT_F_GLOBAL = 0x0400, /**< @brief Global bit flag */
  131. MAT_F_LOGICAL = 0x0200, /**< @brief Logical bit flag */
  132. MAT_F_DONT_COPY_DATA = 0x0001 /**< Don't copy data, use keep the pointer */
  133. };
  134. /** @brief MAT file compression options
  135. *
  136. * This option is only used on version 5 MAT files
  137. * @ingroup MAT
  138. */
  139. enum matio_compression
  140. {
  141. MAT_COMPRESSION_NONE = 0, /**< @brief No compression */
  142. MAT_COMPRESSION_ZLIB = 1 /**< @brief zlib compression */
  143. };
  144. /** @brief matio lookup type
  145. *
  146. * @ingroup MAT
  147. * matio lookup type
  148. */
  149. enum matio_lookup
  150. {
  151. MAT_BY_NAME = 1, /**< Lookup by name */
  152. MAT_BY_INDEX = 2 /**< Lookup by index */
  153. };
  154. /** @brief Complex data type using split storage
  155. *
  156. * Complex data type using split real/imaginary pointers
  157. * @ingroup MAT
  158. */
  159. typedef struct mat_complex_split_t
  160. {
  161. void *Re; /**< Pointer to the real part */
  162. void *Im; /**< Pointer to the imaginary part */
  163. } mat_complex_split_t;
  164. struct _mat_t;
  165. /** @brief Matlab MAT File information
  166. * Contains information about a Matlab MAT file
  167. * @ingroup MAT
  168. */
  169. typedef struct _mat_t mat_t;
  170. /* Incomplete definition for private library data */
  171. struct matvar_internal;
  172. /** @brief Matlab variable information
  173. *
  174. * Contains information about a Matlab variable
  175. * @ingroup MAT
  176. */
  177. typedef struct matvar_t
  178. {
  179. size_t nbytes; /**< Number of bytes for the MAT variable */
  180. int rank; /**< Rank (Number of dimensions) of the data */
  181. enum matio_types data_type; /**< Data type (MAT_T_*) */
  182. int data_size; /**< Bytes / element for the data */
  183. enum matio_classes class_type; /**< Class type in Matlab (MAT_C_DOUBLE, etc) */
  184. int isComplex; /**< non-zero if the data is complex, 0 if real */
  185. int isGlobal; /**< non-zero if the variable is global */
  186. int isLogical; /**< non-zero if the variable is logical */
  187. size_t *dims; /**< Array of lengths for each dimension */
  188. char *name; /**< Name of the variable */
  189. void *data; /**< Pointer to the data */
  190. int mem_conserve; /**< 1 if Memory was conserved with data */
  191. enum matio_compression compression; /**< Variable compression type */
  192. struct matvar_internal *internal; /**< matio internal data */
  193. } matvar_t;
  194. /** @brief sparse data information
  195. *
  196. * Contains information and data for a sparse matrix
  197. * @ingroup MAT
  198. */
  199. typedef struct mat_sparse_t
  200. {
  201. mat_uint32_t nzmax; /**< Maximum number of non-zero elements */
  202. mat_uint32_t *ir; /**< Array of size nzmax where ir[k] is the row of
  203. * data[k]. 0 <= k <= nzmax
  204. */
  205. mat_uint32_t nir; /**< number of elements in ir */
  206. mat_uint32_t *jc; /**< Array size N+1 (N is number of columns) with
  207. * jc[k] being the index into ir/data of the
  208. * first non-zero element for row k.
  209. */
  210. mat_uint32_t njc; /**< Number of elements in jc */
  211. mat_uint32_t ndata; /**< Number of complex/real data values */
  212. void *data; /**< Array of data elements */
  213. } mat_sparse_t;
  214. /** @cond 0 */
  215. #define MATIO_LOG_LEVEL_ERROR 1
  216. #define MATIO_LOG_LEVEL_CRITICAL 1 << 1
  217. #define MATIO_LOG_LEVEL_WARNING 1 << 2
  218. #define MATIO_LOG_LEVEL_MESSAGE 1 << 3
  219. #define MATIO_LOG_LEVEL_DEBUG 1 << 4
  220. /** @endcond */
  221. /** @cond 0 */
  222. #define MATIO_E_NO_ERROR 0
  223. #define MATIO_E_UNKNOWN_ERROR 1
  224. #define MATIO_E_GENERIC_READ_ERROR 2
  225. #define MATIO_E_GENERIC_WRITE_ERROR 3
  226. #define MATIO_E_INDEX_TOO_BIG 4
  227. #define MATIO_E_FILE_FORMAT_VIOLATION 5
  228. #define MATIO_E_FAIL_TO_IDENTIFY 6
  229. #define MATIO_E_BAD_ARGUMENT 7
  230. #define MATIO_E_OUTPUT_BAD_DATA 8
  231. #define MATIO_E_OPERATION_NOT_SUPPORTED 13
  232. #define MATIO_E_OUT_OF_MEMORY 14
  233. #define MATIO_E_BAD_VARIABLE_NAME 15
  234. #define MATIO_E_OPERATION_PROHIBITED_IN_WRITE_MODE 16
  235. #define MATIO_E_OPERATION_PROHIBITED_IN_READ_MODE 17
  236. #define MATIO_E_WRITE_VARIABLE_DOES_NOT_EXIST 18
  237. #define MATIO_E_READ_VARIABLE_DOES_NOT_EXIST 19
  238. #define MATIO_E_FILESYSTEM_COULD_NOT_OPEN 20
  239. #define MATIO_E_FILESYSTEM_COULD_NOT_OPEN_TEMPORARY 21
  240. #define MATIO_E_FILESYSTEM_COULD_NOT_REOPEN 22
  241. #define MATIO_E_BAD_OPEN_MODE 23
  242. #define MATIO_E_FILESYSTEM_ERROR_ON_CLOSE 24
  243. /** @endcond */
  244. /**
  245. * User callback for iteration functions.
  246. * returns 1 to read, 0 to skip
  247. */
  248. typedef int (*mat_iter_pred_t)(const char *name, const void *user_data);
  249. /* Library function */
  250. EXTERN void Mat_GetLibraryVersion(int *major, int *minor, int *release);
  251. /* io.c */
  252. EXTERN int Mat_SetVerbose(int verb, int s);
  253. EXTERN int Mat_SetDebug(int d);
  254. EXTERN void Mat_Critical(const char *format, ...) MATIO_FORMATATTR_PRINTF1;
  255. EXTERN MATIO_NORETURN void Mat_Error(const char *format,
  256. ...) MATIO_NORETURNATTR MATIO_FORMATATTR_PRINTF1;
  257. EXTERN MATIO_NORETURN void Mat_Help(const char *helpstr[]);
  258. EXTERN int Mat_LogInit(const char *prog_name);
  259. EXTERN int Mat_LogClose(void);
  260. EXTERN int Mat_LogInitFunc(const char *prog_name,
  261. void (*log_func)(int log_level, const char *message));
  262. EXTERN int Mat_Message(const char *format, ...) MATIO_FORMATATTR_PRINTF1;
  263. EXTERN int Mat_DebugMessage(int level, const char *format, ...) MATIO_FORMATATTR_PRINTF2;
  264. EXTERN int Mat_VerbMessage(int level, const char *format, ...) MATIO_FORMATATTR_PRINTF2;
  265. EXTERN void Mat_Warning(const char *format, ...) MATIO_FORMATATTR_PRINTF1;
  266. EXTERN size_t Mat_SizeOf(enum matio_types data_type);
  267. EXTERN size_t Mat_SizeOfClass(int class_type);
  268. /* MAT File functions */
  269. /** Create new Matlab MAT file */
  270. #define Mat_Create(a, b) Mat_CreateVer(a, b, MAT_FT_DEFAULT)
  271. EXTERN mat_t *Mat_CreateVer(const char *matname, const char *hdr_str, enum mat_ft mat_file_ver);
  272. EXTERN int Mat_Close(mat_t *mat);
  273. EXTERN mat_t *Mat_Open(const char *matname, int mode);
  274. EXTERN enum mat_acc Mat_GetFileAccessMode(const mat_t *mat);
  275. EXTERN const char *Mat_GetFilename(const mat_t *mat);
  276. EXTERN const char *Mat_GetHeader(const mat_t *mat);
  277. EXTERN enum mat_ft Mat_GetVersion(const mat_t *mat);
  278. EXTERN char *const *Mat_GetDir(mat_t *mat, size_t *n);
  279. EXTERN int Mat_Rewind(mat_t *mat);
  280. /* MAT variable functions */
  281. EXTERN matvar_t *Mat_VarCalloc(void);
  282. EXTERN matvar_t *Mat_VarCreate(const char *name, enum matio_classes class_type,
  283. enum matio_types data_type, int rank, const size_t *dims,
  284. const void *data, int opt);
  285. EXTERN matvar_t *Mat_VarCreateStruct(const char *name, int rank, const size_t *dims,
  286. const char **fields, unsigned nfields);
  287. EXTERN int Mat_VarDelete(mat_t *mat, const char *name);
  288. EXTERN matvar_t *Mat_VarDuplicate(const matvar_t *in, int opt);
  289. EXTERN void Mat_VarFree(matvar_t *matvar);
  290. EXTERN matvar_t *Mat_VarGetCell(const matvar_t *matvar, int index);
  291. EXTERN matvar_t **Mat_VarGetCells(const matvar_t *matvar, const int *start, const int *stride,
  292. const int *edge);
  293. EXTERN matvar_t **Mat_VarGetCellsLinear(const matvar_t *matvar, int start, int stride, int edge);
  294. EXTERN size_t Mat_VarGetSize(const matvar_t *matvar);
  295. EXTERN unsigned Mat_VarGetNumberOfFields(const matvar_t *matvar);
  296. EXTERN int Mat_VarAddStructField(matvar_t *matvar, const char *fieldname);
  297. EXTERN char *const *Mat_VarGetStructFieldnames(const matvar_t *matvar);
  298. EXTERN matvar_t *Mat_VarGetStructFieldByIndex(const matvar_t *matvar, size_t field_index,
  299. size_t index);
  300. EXTERN matvar_t *Mat_VarGetStructFieldByName(const matvar_t *matvar, const char *field_name,
  301. size_t index);
  302. EXTERN matvar_t *Mat_VarGetStructField(const matvar_t *matvar, void *name_or_index, int opt,
  303. int index);
  304. EXTERN matvar_t *Mat_VarGetStructs(const matvar_t *matvar, const int *start, const int *stride,
  305. const int *edge, int copy_fields);
  306. EXTERN matvar_t *Mat_VarGetStructsLinear(const matvar_t *matvar, int start, int stride, int edge,
  307. int copy_fields);
  308. EXTERN void Mat_VarPrint(const matvar_t *matvar, int printdata);
  309. EXTERN matvar_t *Mat_VarRead(mat_t *mat, const char *name);
  310. EXTERN int Mat_VarReadData(mat_t *mat, matvar_t *matvar, void *data, const int *start,
  311. const int *stride, const int *edge);
  312. EXTERN int Mat_VarReadDataAll(mat_t *mat, matvar_t *matvar);
  313. EXTERN int Mat_VarReadDataLinear(mat_t *mat, matvar_t *matvar, void *data, int start, int stride,
  314. int edge);
  315. EXTERN matvar_t *Mat_VarReadInfo(mat_t *mat, const char *name);
  316. EXTERN matvar_t *Mat_VarReadNext(mat_t *mat);
  317. EXTERN matvar_t *Mat_VarReadNextPredicate(mat_t *mat, mat_iter_pred_t pred, const void *user_data);
  318. EXTERN matvar_t *Mat_VarReadNextInfo(mat_t *mat);
  319. EXTERN matvar_t *Mat_VarReadNextInfoPredicate(mat_t *mat, mat_iter_pred_t pred,
  320. const void *user_data);
  321. EXTERN matvar_t *Mat_VarSetCell(matvar_t *matvar, int index, matvar_t *cell);
  322. EXTERN matvar_t *Mat_VarSetStructFieldByIndex(matvar_t *matvar, size_t field_index, size_t index,
  323. matvar_t *field);
  324. EXTERN matvar_t *Mat_VarSetStructFieldByName(matvar_t *matvar, const char *field_name, size_t index,
  325. matvar_t *field);
  326. EXTERN int Mat_VarWrite(mat_t *mat, matvar_t *matvar, enum matio_compression compress);
  327. EXTERN int Mat_VarWriteAppend(mat_t *mat, matvar_t *matvar, enum matio_compression compress,
  328. int dim);
  329. EXTERN int Mat_VarWriteInfo(const mat_t *mat, matvar_t *matvar);
  330. EXTERN int Mat_VarWriteData(const mat_t *mat, matvar_t *matvar, void *data, const int *start,
  331. const int *stride, const int *edge);
  332. /* Other functions */
  333. EXTERN int Mat_CalcSingleSubscript(int rank, const int *dims, const int *subs);
  334. EXTERN int Mat_CalcSingleSubscript2(int rank, const size_t *dims, const size_t *subs,
  335. size_t *index);
  336. EXTERN int *Mat_CalcSubscripts(int rank, const int *dims, int index);
  337. EXTERN size_t *Mat_CalcSubscripts2(int rank, const size_t *dims, size_t index);
  338. #endif