root/library/mex/mexparse.h @ 327

Revision 327, 3.0 kB (checked in by miro, 15 years ago)

mexparse -- reading setting from a matlab structure
nicer buildmex.sh -- no function change

Line 
1#include "../../bdm/libconfig/libconfig.h++"
2#include <itpp/itmex.h>
3#include <stdlib.h>
4
5using namespace std;
6using namespace libconfig;
7
8class UImxArray : public Config {
9public:
10        UImxArray(const mxArray *mxarray) : Config() {
11                Setting & setting = this->getRoot(); //setting is a group
12                if (!mxIsStruct(mxarray)) { mexErrMsgTxt("Given mxArray is not a struct."); };
13                //mexCallMATLAB(0, NULL, 1, (mxArray **) &mxarray, "dump");
14                fillGroup(setting, mxarray);
15        }
16
17private:
18        void storeNumeric(Setting &setting, const mxArray *value, string key = "") {
19                //TODO: integer matrices
20                if (!mxIsNumeric(value)) { mexErrMsgTxt("Given mxArray is not numeric."); };
21                mat val = mxArray2mat(value);
22                if ((val.rows() == 1) && (val.cols() == 1)) {
23                        Setting &child = (key=="") ? setting.add(Setting::TypeFloat)
24                                                   : setting.add(key, Setting::TypeFloat);
25                        child = val(0,0);
26                } else {
27                        Setting &child = (key=="") ? setting.add(Setting::TypeGroup)
28                                                   : setting.add(key, Setting::TypeGroup);
29                        Setting &elements = child.add("elements", Setting::TypeArray);
30                        Setting &cols = child.add("cols", Setting::TypeInt);
31                        cols = val.cols();
32                        for (int i=0; i<val.rows(); i++) {
33                                for (int j=0; j<val.cols(); j++) {
34                                        Setting &el = elements.add(Setting::TypeFloat);
35                                        el = val(i,j);
36                                }
37                        }
38                }
39        }
40
41        void fillGroup(Setting &setting, const mxArray *mxarray) {
42                if (!mxIsStruct(mxarray)) { mexErrMsgTxt("Given mxArray is not a struct."); };
43                for(int i=0; i < mxGetNumberOfFields(mxarray); i++) {
44                        const char *key = mxGetFieldNameByNumber(mxarray, i);
45                        mxArray *value = mxGetField(mxarray, 0, key);
46                        if (mxIsChar(value)) {
47                                Setting &child = setting.add(key, Setting::TypeString);
48                                child = mxArray2string(value);
49                        }
50                        if (mxIsLogical(value)) {
51                                Setting &child = setting.add(key, Setting::TypeBoolean);
52                                child = (bool) mxArray2bin(value);
53                        }
54                        if (mxIsStruct(value)) {
55                                Setting &child = setting.add(key, Setting::TypeGroup);
56                                fillGroup(child, value);
57                        }
58                        if (mxIsCell(value)) {
59                                Setting &child = setting.add(key, Setting::TypeList);
60                                fillList(child, value);
61                        }
62                        if (mxIsNumeric(value)) {
63                                storeNumeric(setting, value, (string)key);
64                        }
65                }
66        }
67       
68        void fillList(Setting &setting, const mxArray *mxarray) {
69                if (!mxIsCell(mxarray)) { mexErrMsgTxt("Given mxArray is not a cell."); };
70                for(int i=0; i < mxGetNumberOfElements(mxarray); i++) {
71                        mxArray *value = mxGetCell(mxarray, i);
72                        if (mxIsChar(value)) {
73                                Setting &child = setting.add(Setting::TypeString);
74                                child = mxArray2string(value);
75                        }
76                        if (mxIsLogical(value)) {
77                                Setting &child = setting.add(Setting::TypeBoolean);
78                                child = (bool) mxArray2bin(value);
79                        }
80                        if (mxIsStruct(value)) {
81                                Setting &child = setting.add(Setting::TypeGroup);
82                                fillGroup(child, value);
83                        }
84                        if (mxIsCell(value)) {
85                                Setting &child = setting.add(Setting::TypeList);
86                                fillList(child, value);
87                        }
88                        if (mxIsNumeric(value)) {
89                                storeNumeric(setting, value);
90                        }
91                }
92        }
93};
Note: See TracBrowser for help on using the browser.