Commit 7d01bb9056f462a37f4fafd7628c94ee643ad1d5
1 parent
a8ad9192
matlab matrix saving using a static function (started)
Showing
3 changed files
with
72 additions
and
7 deletions
Show diff stats
stim/image/bmp.h
1 | -#pragma once | 1 | +#ifndef STIM_BMP_H |
2 | +#define STIM_BMP_H | ||
2 | 3 | ||
3 | namespace stim { | 4 | namespace stim { |
4 | #pragma pack(1) | 5 | #pragma pack(1) |
@@ -115,8 +116,8 @@ namespace stim { | @@ -115,8 +116,8 @@ namespace stim { | ||
115 | 116 | ||
116 | 117 | ||
117 | //compression methods | 118 | //compression methods |
118 | - const unsigned int BI_RGB = 0; | ||
119 | - const unsigned int BI_BITFIELDS = 3; | 119 | + const unsigned int STIM_BI_RGB = 0; |
120 | + const unsigned int STIM_BI_BITFIELDS = 3; | ||
120 | 121 | ||
121 | class bmp { | 122 | class bmp { |
122 | std::ifstream file; | 123 | std::ifstream file; |
@@ -194,7 +195,7 @@ namespace stim { | @@ -194,7 +195,7 @@ namespace stim { | ||
194 | } | 195 | } |
195 | read_bmpFileHeader(); //read the file header | 196 | read_bmpFileHeader(); //read the file header |
196 | read_dib(); | 197 | read_dib(); |
197 | - if (compression != BI_RGB) { //check for compression | 198 | + if (compression != STIM_BI_RGB) { //check for compression |
198 | std::cout << "stim::bmp ERROR: this file is compressed, and compression is not supported" << std::endl; | 199 | std::cout << "stim::bmp ERROR: this file is compressed, and compression is not supported" << std::endl; |
199 | return false; | 200 | return false; |
200 | } | 201 | } |
@@ -259,4 +260,6 @@ namespace stim { | @@ -259,4 +260,6 @@ namespace stim { | ||
259 | free(pad); | 260 | free(pad); |
260 | return true; | 261 | return true; |
261 | } | 262 | } |
262 | -} | ||
263 | \ No newline at end of file | 263 | \ No newline at end of file |
264 | +} | ||
265 | + | ||
266 | +#endif | ||
264 | \ No newline at end of file | 267 | \ No newline at end of file |
stim/image/image.h
@@ -5,6 +5,8 @@ | @@ -5,6 +5,8 @@ | ||
5 | //#include <opencv2/core/core.hpp> | 5 | //#include <opencv2/core/core.hpp> |
6 | //#include <opencv2/highgui/highgui.hpp> | 6 | //#include <opencv2/highgui/highgui.hpp> |
7 | #include <opencv2/opencv.hpp> | 7 | #include <opencv2/opencv.hpp> |
8 | +#else | ||
9 | + #include <stim/image/bmp.h> | ||
8 | #endif | 10 | #endif |
9 | #include <vector> | 11 | #include <vector> |
10 | #include <iostream> | 12 | #include <iostream> |
@@ -13,7 +15,7 @@ | @@ -13,7 +15,7 @@ | ||
13 | #include <fstream> | 15 | #include <fstream> |
14 | #include <cstring> | 16 | #include <cstring> |
15 | 17 | ||
16 | -#include <stim/image/bmp.h> | 18 | + |
17 | #include <stim/parser/filename.h> | 19 | #include <stim/parser/filename.h> |
18 | 20 | ||
19 | namespace stim{ | 21 | namespace stim{ |
stim/math/matrix.h
@@ -10,6 +10,27 @@ | @@ -10,6 +10,27 @@ | ||
10 | 10 | ||
11 | namespace stim{ | 11 | namespace stim{ |
12 | 12 | ||
13 | + enum mat4Format { | ||
14 | + mat4_float64, | ||
15 | + mat4_float32, | ||
16 | + mat4_int32, | ||
17 | + mat4_int16, | ||
18 | + mat4_uint16, | ||
19 | + mat4_uint8, | ||
20 | + mat4_float //floating point type, determined automatically | ||
21 | + }; | ||
22 | + | ||
23 | + size_t mat4Format_size(mat4Format f){ | ||
24 | + switch(f){ | ||
25 | + case mat4_float64: return 8; | ||
26 | + case mat4_float32: | ||
27 | + case mat4_int32: return 4; | ||
28 | + case mat4_int16: | ||
29 | + case mat4_uint16: return 2; | ||
30 | + case mat4_uint8: return 1; | ||
31 | + default: return 0; | ||
32 | + } | ||
33 | + } | ||
13 | template <class T> | 34 | template <class T> |
14 | class matrix { | 35 | class matrix { |
15 | //the matrix will be stored in column-major order (compatible with OpenGL) | 36 | //the matrix will be stored in column-major order (compatible with OpenGL) |
@@ -17,6 +38,9 @@ class matrix { | @@ -17,6 +38,9 @@ class matrix { | ||
17 | size_t R; //number of rows | 38 | size_t R; //number of rows |
18 | size_t C; //number of colums | 39 | size_t C; //number of colums |
19 | 40 | ||
41 | + size_t bytes() { | ||
42 | + return R * C * sizeof(T); //return the number of bytes of matrix data | ||
43 | + } | ||
20 | /*void init(size_t rows, size_t cols){ | 44 | /*void init(size_t rows, size_t cols){ |
21 | R = rows; | 45 | R = rows; |
22 | C = cols; | 46 | C = cols; |
@@ -268,7 +292,7 @@ public: | @@ -268,7 +292,7 @@ public: | ||
268 | } | 292 | } |
269 | 293 | ||
270 | /// Sort columns of the matrix by the specified indices | 294 | /// Sort columns of the matrix by the specified indices |
271 | - matrix<T> sort_cols(size_t* idx) const { | 295 | + matrix<T> sort_cols(size_t* idx, size_t data_type = mat4_float) const { |
272 | matrix<T> result(C, R); | 296 | matrix<T> result(C, R); |
273 | size_t c; | 297 | size_t c; |
274 | for (c = 0; c < C; c++) { //for each column | 298 | for (c = 0; c < C; c++) { //for each column |
@@ -355,8 +379,44 @@ public: | @@ -355,8 +379,44 @@ public: | ||
355 | } | 379 | } |
356 | } | 380 | } |
357 | 381 | ||
382 | + // saves the matrix as a Level-4 MATLAB file | ||
383 | + void mat4(std::string filename, std::string name = std::string("unknown"), mat4Format = mat4_float) { | ||
384 | + int MOPT = 0; //initialize the MOPT type value to zero | ||
385 | + int m = 0; //little endian | ||
386 | + int o = 0; //reserved, always 0 | ||
387 | + int p = mat4_float; | ||
388 | + if (mat4_float) { | ||
389 | + if (sizeof(T) == 4) p = mat4_float32; | ||
390 | + else if (sizeof(T) == 8) p = mat4_float64; | ||
391 | + else { | ||
392 | + std::cout << "stim::matrix ERROR - incorrect format specified" << std::endl; | ||
393 | + exit(1); | ||
394 | + } | ||
395 | + } | ||
396 | + int t = 0; | ||
397 | + MOPT = m * 1000 + o * 100 + p * 10 + t; //calculate the type value | ||
398 | + int mrows = rows(); | ||
399 | + int ncols = cols(); | ||
400 | + int imagf = 0; //assume real (for now) | ||
401 | + name += "\0"; //add a null to the string | ||
402 | + int namlen = name.size(); //calculate the name size | ||
403 | + | ||
404 | + std::ofstream outfile(filename, std::ios::binary); | ||
405 | + outfile.write((char*)&MOPT, 4); | ||
406 | + outfile.write((char*)&mrows, 4); | ||
407 | + outfile.write((char*)&ncols, 4); | ||
408 | + outfile.write((char*)&imagf, 4); | ||
409 | + outfile.write((char*)&namlen, 4); | ||
410 | + outfile.write((char*)&name[0], namlen); | ||
411 | + outfile.write((char*)M, bytes()); //write the matrix data | ||
412 | + outfile.close(); | ||
413 | + } | ||
358 | }; | 414 | }; |
359 | 415 | ||
416 | +void save_mat4(char* data, std::string filename, std::string varname, size_t sx, size_t sy, mat4Format format){ | ||
417 | + //save the matrix file here (use the mat4 function above) | ||
418 | + //data format: https://maxwell.ict.griffith.edu.au/spl/matlab-page/matfile_format.pdf (page 32) | ||
419 | +} | ||
360 | } //end namespace rts | 420 | } //end namespace rts |
361 | 421 | ||
362 | 422 |