MatFileIO.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661
  1. /**
  2. * @file MatFileIO.cpp
  3. * @brief Read and write mat-files
  4. * @author Paul Bodesheim
  5. * @date 06-01-2012 (dd-mm-yyyy)
  6. */
  7. #include "MatFileIO.h"
  8. namespace NICE {
  9. //------------------------------------------------------
  10. // several constructors and destructors
  11. //------------------------------------------------------
  12. // Default constructor
  13. MatFileIO::MatFileIO() { mat = 0; }
  14. // Recommended constructor
  15. MatFileIO::MatFileIO(std::string _filename, const mat_acc mode) {
  16. mat = Mat_Open(_filename.c_str(),mode);
  17. if (mat == NULL && mode == MAT_ACC_RDONLY) {
  18. fthrow(Exception, "MatFileIO::MatFileIO(const char * _filename, int mode): mat-file does not exist");
  19. }
  20. }
  21. // Default destructor
  22. MatFileIO::~MatFileIO() {
  23. Mat_Close(mat);
  24. }
  25. //------------------------------------------------------
  26. // count number of stored variables
  27. //------------------------------------------------------
  28. int MatFileIO::getNumberOfVariables() {
  29. Mat_Rewind(mat); // get back to first variable
  30. int count = 0;
  31. matvar_t * matvar = Mat_VarReadNextInfo(mat);
  32. while (matvar != NULL) {
  33. count++;
  34. matvar = Mat_VarReadNextInfo(mat);
  35. }
  36. Mat_VarFree(matvar);
  37. return count;
  38. }
  39. //------------------------------------------------------
  40. // several methods for reading data
  41. //------------------------------------------------------
  42. matvar_t * MatFileIO::getVariableViaName(std::string _name) {
  43. // std::cout << "MatFileIO::getVariableViaName: method entered" << std::endl;
  44. char * cString = new char[256];
  45. // std::cout << "MatFileIO::getVariableViaName: cString init done" << std::endl;
  46. return Mat_VarRead(mat,strcpy(cString,_name.c_str()));
  47. }
  48. void MatFileIO::getSparseVariableViaName(sparse_t & sparseVariable, std::string _name) {
  49. matvar_t * matvar = getVariableViaName(_name);
  50. if (matvar == NULL) {
  51. fthrow(Exception, "MatFileIO::getSparseVariableViaName(sparse_t & sparseVariable, std::string _name): variable with specified name does not exist");
  52. return;
  53. }
  54. if (matvar->class_type != MAT_C_SPARSE) {
  55. fthrow(Exception, "MatFileIO::getSparseVariableViaName(sparse_t & sparseVariable, std::string _name): format of variable is not sparse");
  56. return;
  57. }
  58. sparseVariable = *((sparse_t*)matvar->data);
  59. sparseVariable.data = (double*) sparseVariable.data;
  60. }
  61. void MatFileIO::getFeatureMatrixViaName(std::vector<std::vector<double> > & features, std::string _name, const feature_matrix_order order) {
  62. matvar_t * matvar = getVariableViaName(_name);
  63. if (matvar == NULL) {
  64. fthrow(Exception, "MatFileIO::getFeatureMatrixViaName(char * _name, feature_matrix_order order): variable with specified name does not exist");
  65. return;
  66. }
  67. if (matvar->rank != 2) {
  68. fthrow(Exception, "MatFileIO::getFeatureMatrixViaName(char * _name, feature_matrix_order order): dimension of variable != 2");
  69. return;
  70. }
  71. features.clear();
  72. std::vector<double> currentFeature;
  73. currentFeature.clear();
  74. // case 1: feature vectors in the rows of matrix
  75. if (order == NxD) {
  76. // depending on the class type of data elements, we have to treat several cases and cast the data elements correctly
  77. switch (matvar->data_type) {
  78. case MAT_T_DOUBLE:
  79. for ( int i = 0; i < matvar->dims[0]; i++ ) {
  80. for ( int j = 0; j < matvar->dims[1]; j++ ) {
  81. currentFeature.push_back( ((double*)matvar->data)[matvar->dims[0]*j+i] );
  82. }
  83. features.push_back(currentFeature);
  84. currentFeature.clear();
  85. }
  86. break;
  87. case MAT_T_SINGLE:
  88. for ( int i = 0; i < matvar->dims[0]; i++ ) {
  89. for ( int j = 0; j < matvar->dims[1]; j++ ) {
  90. currentFeature.push_back( ((float*)matvar->data)[matvar->dims[0]*j+i] );
  91. }
  92. features.push_back(currentFeature);
  93. currentFeature.clear();
  94. }
  95. break;
  96. #ifdef HAVE_MAT_INT64_T
  97. case MAT_T_INT64:
  98. for ( int i = 0; i < matvar->dims[0]; i++ ) {
  99. for ( int j = 0; j < matvar->dims[1]; j++ ) {
  100. currentFeature.push_back( ((signed long long*)matvar->data)[matvar->dims[0]*j+i] );
  101. }
  102. features.push_back(currentFeature);
  103. currentFeature.clear();
  104. }
  105. break;
  106. #endif
  107. #ifdef HAVE_MAT_UINT64_T
  108. case MAT_T_UINT64:
  109. for ( int i = 0; i < matvar->dims[0]; i++ ) {
  110. for ( int j = 0; j < matvar->dims[1]; j++ ) {
  111. currentFeature.push_back( ((unsigned long long*)matvar->data)[matvar->dims[0]*j+i] );
  112. }
  113. features.push_back(currentFeature);
  114. currentFeature.clear();
  115. }
  116. break;
  117. #endif
  118. case MAT_T_INT32:
  119. for ( int i = 0; i < matvar->dims[0]; i++ ) {
  120. for ( int j = 0; j < matvar->dims[1]; j++ ) {
  121. currentFeature.push_back( ((signed long*)matvar->data)[matvar->dims[0]*j+i] );
  122. }
  123. features.push_back(currentFeature);
  124. currentFeature.clear();
  125. }
  126. break;
  127. case MAT_T_UINT32:
  128. for ( int i = 0; i < matvar->dims[0]; i++ ) {
  129. for ( int j = 0; j < matvar->dims[1]; j++ ) {
  130. currentFeature.push_back( ((unsigned long*)matvar->data)[matvar->dims[0]*j+i] );
  131. }
  132. features.push_back(currentFeature);
  133. currentFeature.clear();
  134. }
  135. break;
  136. case MAT_T_INT16:
  137. for ( int i = 0; i < matvar->dims[0]; i++ ) {
  138. for ( int j = 0; j < matvar->dims[1]; j++ ) {
  139. currentFeature.push_back( ((signed short*)matvar->data)[matvar->dims[0]*j+i] );
  140. }
  141. features.push_back(currentFeature);
  142. currentFeature.clear();
  143. }
  144. break;
  145. case MAT_T_UINT16:
  146. for ( int i = 0; i < matvar->dims[0]; i++ ) {
  147. for ( int j = 0; j < matvar->dims[1]; j++ ) {
  148. currentFeature.push_back( ((unsigned short*)matvar->data)[matvar->dims[0]*j+i] );
  149. }
  150. features.push_back(currentFeature);
  151. currentFeature.clear();
  152. }
  153. break;
  154. case MAT_T_INT8:
  155. for ( int i = 0; i < matvar->dims[0]; i++ ) {
  156. for ( int j = 0; j < matvar->dims[1]; j++ ) {
  157. currentFeature.push_back( ((signed char*)matvar->data)[matvar->dims[0]*j+i] );
  158. }
  159. features.push_back(currentFeature);
  160. currentFeature.clear();
  161. }
  162. break;
  163. case MAT_T_UINT8:
  164. for ( int i = 0; i < matvar->dims[0]; i++ ) {
  165. for ( int j = 0; j < matvar->dims[1]; j++ ) {
  166. currentFeature.push_back( ((unsigned char*)matvar->data)[matvar->dims[0]*j+i] );
  167. }
  168. features.push_back(currentFeature);
  169. currentFeature.clear();
  170. }
  171. break;
  172. }
  173. // case 2: feature vectors in the columns of matrix
  174. } else if (order == DxN) {
  175. // depending on the class type of data elements, we have to treat several cases and cast the data elements correctly
  176. switch (matvar->data_type) {
  177. case MAT_T_DOUBLE:
  178. for ( int j = 0; j < matvar->dims[1]; j++ ) {
  179. for ( int i = 0; i < matvar->dims[0]; i++ ) {
  180. currentFeature.push_back( ((double*)matvar->data)[matvar->dims[0]*j+i] );
  181. }
  182. features.push_back(currentFeature);
  183. currentFeature.clear();
  184. }
  185. break;
  186. case MAT_T_SINGLE:
  187. for ( int j = 0; j < matvar->dims[1]; j++ ) {
  188. for ( int i = 0; i < matvar->dims[0]; i++ ) {
  189. currentFeature.push_back( ((float*)matvar->data)[matvar->dims[0]*j+i] );
  190. }
  191. features.push_back(currentFeature);
  192. currentFeature.clear();
  193. }
  194. break;
  195. #ifdef HAVE_MAT_INT64_T
  196. case MAT_T_INT64:
  197. for ( int j = 0; j < matvar->dims[1]; j++ ) {
  198. for ( int i = 0; i < matvar->dims[0]; i++ ) {
  199. currentFeature.push_back( ((signed long long*)matvar->data)[matvar->dims[0]*j+i] );
  200. }
  201. features.push_back(currentFeature);
  202. currentFeature.clear();
  203. }
  204. break;
  205. #endif
  206. #ifdef HAVE_MAT_UINT64_T
  207. case MAT_T_UINT64:
  208. for ( int j = 0; j < matvar->dims[1]; j++ ) {
  209. for ( int i = 0; i < matvar->dims[0]; i++ ) {
  210. currentFeature.push_back( ((unsigned long long*)matvar->data)[matvar->dims[0]*j+i] );
  211. }
  212. features.push_back(currentFeature);
  213. currentFeature.clear();
  214. }
  215. break;
  216. #endif
  217. case MAT_T_INT32:
  218. for ( int j = 0; j < matvar->dims[1]; j++ ) {
  219. for ( int i = 0; i < matvar->dims[0]; i++ ) {
  220. currentFeature.push_back( ((signed long*)matvar->data)[matvar->dims[0]*j+i] );
  221. }
  222. features.push_back(currentFeature);
  223. currentFeature.clear();
  224. }
  225. break;
  226. case MAT_T_UINT32:
  227. for ( int j = 0; j < matvar->dims[1]; j++ ) {
  228. for ( int i = 0; i < matvar->dims[0]; i++ ) {
  229. currentFeature.push_back( ((unsigned long*)matvar->data)[matvar->dims[0]*j+i] );
  230. }
  231. features.push_back(currentFeature);
  232. currentFeature.clear();
  233. }
  234. break;
  235. case MAT_T_INT16:
  236. for ( int j = 0; j < matvar->dims[1]; j++ ) {
  237. for ( int i = 0; i < matvar->dims[0]; i++ ) {
  238. currentFeature.push_back( ((signed short*)matvar->data)[matvar->dims[0]*j+i] );
  239. }
  240. features.push_back(currentFeature);
  241. currentFeature.clear();
  242. }
  243. break;
  244. case MAT_T_UINT16:
  245. for ( int j = 0; j < matvar->dims[1]; j++ ) {
  246. for ( int i = 0; i < matvar->dims[0]; i++ ) {
  247. currentFeature.push_back( ((unsigned short*)matvar->data)[matvar->dims[0]*j+i] );
  248. }
  249. features.push_back(currentFeature);
  250. currentFeature.clear();
  251. }
  252. break;
  253. case MAT_T_INT8:
  254. for ( int j = 0; j < matvar->dims[1]; j++ ) {
  255. for ( int i = 0; i < matvar->dims[0]; i++ ) {
  256. currentFeature.push_back( ((signed char*)matvar->data)[matvar->dims[0]*j+i] );
  257. }
  258. features.push_back(currentFeature);
  259. currentFeature.clear();
  260. }
  261. break;
  262. case MAT_T_UINT8:
  263. for ( int j = 0; j < matvar->dims[1]; j++ ) {
  264. for ( int i = 0; i < matvar->dims[0]; i++ ) {
  265. currentFeature.push_back( ((unsigned char*)matvar->data)[matvar->dims[0]*j+i] );
  266. }
  267. features.push_back(currentFeature);
  268. currentFeature.clear();
  269. }
  270. break;
  271. }
  272. } else {
  273. fthrow(Exception, "MatFileIO::getFeatureMatrixViaName(char * _name, feature_matrix_order order): wrong feature_matrix_order specified");
  274. return;
  275. }
  276. }
  277. void MatFileIO::getVectorViaName(NICE::Vector & vec, std::string _name) {
  278. matvar_t * matvar = getVariableViaName(_name);
  279. if (matvar == NULL) {
  280. fthrow(Exception, "MatFileIO::getVectorViaName(NICE::Vector & vec, std::string _name): variable with specified name does not exist");
  281. return;
  282. }
  283. // it can happen that a vector is treated as (N x 1) or (1 x N) matrix with two dimensions
  284. if (matvar->rank > 2 || ( (matvar->rank == 2) && (matvar->dims[0] != 1) && (matvar->dims[1] != 1) ) ) {
  285. fthrow(Exception, "MatFileIO::getVectorViaName(NICE::Vector & vec, std::string _name): dimension of variable > 1");
  286. return;
  287. }
  288. std::vector<double> v;
  289. v.clear();
  290. // vector is stored as a variable with one dimensional
  291. if (matvar->rank == 1) {
  292. switch( matvar->data_type ) {
  293. case MAT_T_DOUBLE:
  294. for ( int i = 0; i < matvar->nbytes/matvar->data_size; i++ ) {
  295. v.push_back( ((double*)matvar->data)[i] );
  296. }
  297. break;
  298. case MAT_T_SINGLE:
  299. for ( int i = 0; i < matvar->nbytes/matvar->data_size; i++ ) {
  300. v.push_back( ((float*)matvar->data)[i] );
  301. }
  302. break;
  303. #ifdef HAVE_MAT_INT64_T
  304. case MAT_T_INT64:
  305. for ( int i = 0; i < matvar->nbytes/matvar->data_size; i++ ) {
  306. v.push_back( ((signed long long*)matvar->data)[i] );
  307. }
  308. break;
  309. #endif
  310. #ifdef HAVE_MAT_UINT64_T
  311. case MAT_T_UINT64:
  312. for ( int i = 0; i < matvar->nbytes/matvar->data_size; i++ ) {
  313. v.push_back( ((unsigned long long*)matvar->data)[i] );
  314. }
  315. break;
  316. #endif
  317. case MAT_T_INT32:
  318. for ( int i = 0; i < matvar->nbytes/matvar->data_size; i++ ) {
  319. v.push_back( ((signed long*)matvar->data)[i] );
  320. }
  321. break;
  322. case MAT_T_UINT32:
  323. for ( int i = 0; i < matvar->nbytes/matvar->data_size; i++ ) {
  324. v.push_back( ((unsigned long*)matvar->data)[i] );
  325. }
  326. break;
  327. case MAT_T_INT16:
  328. for ( int i = 0; i < matvar->nbytes/matvar->data_size; i++ ) {
  329. v.push_back( ((signed short*)matvar->data)[i] );
  330. }
  331. break;
  332. case MAT_T_UINT16:
  333. for ( int i = 0; i < matvar->nbytes/matvar->data_size; i++ ) {
  334. v.push_back( ((unsigned short*)matvar->data)[i] );
  335. }
  336. break;
  337. case MAT_T_INT8:
  338. for ( int i = 0; i < matvar->nbytes/matvar->data_size; i++ ) {
  339. v.push_back( ((signed char*)matvar->data)[i] );
  340. }
  341. break;
  342. case MAT_T_UINT8:
  343. for ( int i = 0; i < matvar->nbytes/matvar->data_size; i++ ) {
  344. v.push_back( ((unsigned char*)matvar->data)[i] );
  345. }
  346. break;
  347. }
  348. // it can happen that a vector is treated as (N x 1) or (1 x N) matrix with two dimensions, here we handle this case
  349. } else {
  350. switch( matvar->data_type ) {
  351. case MAT_T_DOUBLE:
  352. for ( int i = 0; i < matvar->dims[0]; i++ ) {
  353. for ( int j = 0; j < matvar->dims[1]; j++ ) {
  354. v.push_back( ((double*)matvar->data)[matvar->dims[0]*j+i] );
  355. }
  356. }
  357. break;
  358. case MAT_T_SINGLE:
  359. for ( int i = 0; i < matvar->dims[0]; i++ ) {
  360. for ( int j = 0; j < matvar->dims[1]; j++ ) {
  361. v.push_back( ((float*)matvar->data)[matvar->dims[0]*j+i] );
  362. }
  363. }
  364. break;
  365. #ifdef HAVE_MAT_INT64_T
  366. case MAT_T_INT64:
  367. for ( int i = 0; i < matvar->dims[0]; i++ ) {
  368. for ( int j = 0; j < matvar->dims[1]; j++ ) {
  369. v.push_back( ((signed long long*)matvar->data)[matvar->dims[0]*j+i] );
  370. }
  371. }
  372. break;
  373. #endif
  374. #ifdef HAVE_MAT_UINT64_T
  375. case MAT_T_UINT64:
  376. for ( int i = 0; i < matvar->dims[0]; i++ ) {
  377. for ( int j = 0; j < matvar->dims[1]; j++ ) {
  378. v.push_back( ((unsigned long long*)matvar->data)[matvar->dims[0]*j+i] );
  379. }
  380. }
  381. break;
  382. #endif
  383. case MAT_T_INT32:
  384. for ( int i = 0; i < matvar->dims[0]; i++ ) {
  385. for ( int j = 0; j < matvar->dims[1]; j++ ) {
  386. v.push_back( ((signed long*)matvar->data)[matvar->dims[0]*j+i] );
  387. }
  388. }
  389. break;
  390. case MAT_T_UINT32:
  391. for ( int i = 0; i < matvar->dims[0]; i++ ) {
  392. for ( int j = 0; j < matvar->dims[1]; j++ ) {
  393. v.push_back( ((unsigned long*)matvar->data)[matvar->dims[0]*j+i] );
  394. }
  395. }
  396. break;
  397. case MAT_T_INT16:
  398. for ( int i = 0; i < matvar->dims[0]; i++ ) {
  399. for ( int j = 0; j < matvar->dims[1]; j++ ) {
  400. v.push_back( ((signed short*)matvar->data)[matvar->dims[0]*j+i] );
  401. }
  402. }
  403. break;
  404. case MAT_T_UINT16:
  405. for ( int i = 0; i < matvar->dims[0]; i++ ) {
  406. for ( int j = 0; j < matvar->dims[1]; j++ ) {
  407. v.push_back( ((unsigned short*)matvar->data)[matvar->dims[0]*j+i] );
  408. }
  409. }
  410. break;
  411. case MAT_T_INT8:
  412. for ( int i = 0; i < matvar->dims[0]; i++ ) {
  413. for ( int j = 0; j < matvar->dims[1]; j++ ) {
  414. v.push_back( ((signed char*)matvar->data)[matvar->dims[0]*j+i] );
  415. }
  416. }
  417. break;
  418. case MAT_T_UINT8:
  419. for ( int i = 0; i < matvar->dims[0]; i++ ) {
  420. for ( int j = 0; j < matvar->dims[1]; j++ ) {
  421. v.push_back( ((unsigned char*)matvar->data)[matvar->dims[0]*j+i] );
  422. }
  423. }
  424. break;
  425. }
  426. }
  427. vec = NICE::Vector(v);
  428. }
  429. }