Advertisement
x89codered89x

matlab.h

Apr 19th, 2014
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.92 KB | None | 0 0
  1. #ifndef MATLAB_WRAPPER_H
  2. #define MATLAB_WRAPPER_H
  3.  
  4. #include <map>
  5. #include <cstring>
  6. #include <fstream>
  7. #include "engine.h" //Matlab engine
  8. #include "mystringtools.h"
  9.  
  10. //include command line compile
  11.  
  12. //Uncomment next for lines if using MS Visual Studio
  13. class MatlabHandle{
  14.  
  15.     public:
  16.         MatlabHandle()
  17.         {
  18.  
  19.         }
  20.  
  21.         ~MatlabHandle() {
  22.        
  23.             clearAllVariables();
  24.         }
  25.  
  26.         template <class T>
  27.         void pass( T scalar, const char* varName) {
  28.  
  29.             double scalar_in = scalar;
  30.  
  31.             //delete potentially old variable with same name;
  32.             deleteVariable(varName);
  33.  
  34.             //create vectorPtr in correct format for matlab
  35.             arrayMap[std::string(varName)] = mxCreateDoubleScalar((double)scalar);
  36.  
  37.             //copy data to this new vector in matlab format
  38.             //memcpy( (void *)mxGetPr(arrayMap[std::string(varName)]), (void *)&scalar_in, sizeof(double) );
  39.  
  40.             //pass to matlab
  41.             engPutVariable(matlabEnginePtr,varName,arrayMap[std::string(varName)]);
  42.  
  43.         }
  44.  
  45.  
  46.         template <class T>
  47.         void pass(  T * vectorPtr, int M, const char* varName){
  48.  
  49.             //create type-correct C array;
  50.             double * vectorPtr_in = new double[M];
  51.             for (int m = 0; m < M; m++) vectorPtr_in[m] = vectorPtr[m];
  52.            
  53.             //delete potentially old variable with same name;
  54.             deleteVariable(varName);
  55.  
  56.             //create vectorPtr_in in correct format for matlab
  57.             arrayMap[std::string(varName)] = mxCreateDoubleMatrix(M,1,mxREAL);
  58.  
  59.             //copy data to this new vector in matlab format
  60.             memcpy( (void *)mxGetPr(arrayMap[std::string(varName)]), (void *)vectorPtr_in, sizeof(double)*M );
  61.  
  62.             //pass to matlab
  63.             engPutVariable(matlabEnginePtr,varName,arrayMap[std::string(varName)]);
  64.  
  65.             delete [] vectorPtr_in;
  66.  
  67.         }
  68.         template <class T>
  69.         void pass( T ** matrixPtr, int M, int N, const char* varName){
  70.  
  71.  
  72.  
  73.             //delete potentially old variable with same name;
  74.             deleteVariable(varName);
  75.             std::string varName_string =varName;
  76.  
  77.             //create matrixPtr in correct format for matlab
  78.             arrayMap[varName_string] = mxCreateNumericMatrix(M,N,mxDOUBLE_CLASS,mxREAL);
  79.  
  80.             unsigned int *mn_C = new unsigned int[2];
  81.             for (int m = 0; m < M; m++){
  82.                 mn_C[0] = m;
  83.                 for (int n = 0; n < N; n++){
  84.                     mn_C[1] = n;
  85.                     mwIndex mn_matlab =  mxCalcSingleSubscript(arrayMap[varName_string],2,mn_C);//convert index to matlab's indexing
  86.                     mxGetPr(arrayMap[varName_string])[mn_matlab] = (double)matrixPtr[m][n];
  87.                 }
  88.             }
  89.  
  90.             //pass to matlab
  91.             engPutVariable(matlabEnginePtr,varName,arrayMap[varName_string]);
  92.  
  93.  
  94.         }
  95.  
  96.  
  97.         void title(const char* Title) {
  98.             send(std::string("title(")+"\'"+Title+"\')");
  99.         }
  100.         void xlabel(const char* Xlabel) {
  101.             send(std::string("xlabel(")+"\'"+Xlabel+"\')");
  102.         }
  103.         void ylabel(const char* Ylabel) {
  104.             send(std::string("ylabel(")+"\'"+Ylabel+"\')");
  105.         }
  106.  
  107.         void send(std::string command = ""){
  108.             if (command == "") return;
  109.  
  110.             engEvalString(matlabEnginePtr,command.c_str());
  111.  
  112.         }
  113.  
  114.         void clearAllVariables(){
  115.             std::map<std::string,mxArray*>::iterator it;
  116.             for (it = arrayMap.begin(); it != arrayMap.end(); it++){
  117.                 //mxDestroyArray(it->second);
  118.             }
  119.         }
  120.  
  121.         void deleteVariable(const char* varName){
  122.             if (arrayMap.find(varName) == arrayMap.end())
  123.                 return;
  124.             else
  125.                 arrayMap.erase(arrayMap.find(varName));//varName upcasts to string
  126.  
  127.         }
  128.  
  129.         //in local folder
  130.         void loadScriptandSend(const char* fileName) {
  131.             std::ifstream matlabScript(fileName);
  132.  
  133.             if (matlabScript.is_open()){
  134.                 matlabScript.seekg(0,std::ios::end);
  135.                 std::streampos length = matlabScript.tellg();
  136.                 matlabScript.seekg(0,std::ios::beg);
  137.                 std::string command;
  138.                 char buffer[(int)length];
  139.                 matlabScript.read(buffer,length);
  140.                 command = buffer;              
  141.                 std::cout << "matlabScript: \n\n" << command << "\n" << std::endl;
  142.                 send(command);
  143.             } else {
  144.                 send("display('Error: could not load requested script.');");   
  145.             }
  146.  
  147.             matlabScript.close();
  148.         }
  149.  
  150.     private:
  151.  
  152.     std::map<std::string,mxArray*> arrayMap;
  153.     static Engine * matlabEnginePtr;
  154.  
  155. };
  156. Engine* MatlabHandle::matlabEnginePtr = engOpen(NULL);
  157.  
  158. // template <>
  159. // void MatlabHandle::pass( int scalar, const char* varName) {
  160.  
  161. //  double scalar_in = scalar;
  162.  
  163. //  //delete potentially old variable with same name;
  164. //  deleteVariable(varName);
  165.  
  166. //  //create vectorPtr in correct format for matlab
  167. //  arrayMap[std::string(varName)] = mxCreateNumericMatrix(1,1,mxINT32_CLASS,mxREAL);
  168.  
  169. //  *mxGetPr(arrayMap[std::string(varName)]) = (int32_t)scalar;
  170.    
  171. //  //pass to matlab
  172. //  engPutVariable(matlabEnginePtr,varName,arrayMap[std::string(varName)]);
  173.  
  174. // }
  175. template <>
  176. void MatlabHandle::pass(const char* textVariable, const char* varName) {
  177.  
  178.     //create string in matlab format - and initialization
  179.     arrayMap[std::string(varName)] = mxCreateString(textVariable);
  180.  
  181.     //pass to matlab
  182.     engPutVariable(matlabEnginePtr,varName,arrayMap[std::string(varName)]);
  183.  
  184. }
  185.     //Extension
  186.     #ifdef PROBABILITY_H
  187.         #include "probability_and_matlab_extensions.h"
  188.     #endif
  189.  
  190. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement