MatFileIO.cpp 16 KB

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