MatLab API To C++
MatLab API To C++
Christopher Dabney
Purpose
MatLab
has excellent prototyping and plotting functionality contains convenient and very robust matrix operation packages
Purpose (cont)
C++
is a programming language, optimal and with high speed floating point computation is non-trivial to produce visual effects in
Purpose (cont)
number crunching in C++ matrix operations in MatLab plotting, graphing, tables in MatLab
For programmers with a robust & complex C++ program intending to plot results they are already obtaining For MatLab programming with scripts which frequently lag
Not restricted to C++; Java, Perl, Fortran, and other languages can do it also Not restricted to the MS Visual Studio environment the demos are written in Also possible to invoke a C++ routine from MatLabs environment
Three ways to interact
Send Data from C++ to MatLab Call a MatLab function from C++ Generate a Dynamic Link Library (dll) file from a .m file
Demo Requirements
A C++ Compiler
the demo uses MS Visual C++ v.6.0 the demo uses MatLab v.7.0.1
MatLab
paths to MatLab:
- Tools -> Options - Directories Tab - Select "Include files" from the drop-down list - Add "C:\MATLAB701\EXTERN\INCLUDE" to the list - Select "Library Files" from the drop-down list - Add C:\MATLAB701\EXTERN\LIB\WIN32\MICROSOFT\MSVC60
Screenshot
Screenshot
Header: #include <engine.h>, MatLabs Engine In the program, create a pointer to it:
Engine *m_pEngine; m_pEngine = engOpen(NULL); if (m_pEngine == NULL) { cout << "Error: Not Found << endl; exit(1); }
Invoking Commands
Enables programmer to invoke any command in MatLab from the C++ platform (convenient) Not special by itself - might as well work straight from MatLab
Use the matrix array mxArray data type Every variable in MatLab is a matrix for C++ to exchange data with it, a data type that both C++ and MatLab recognize is needed mxArray can bundle C++ variables as matrices, so both platforms recognize this data type
To pass a variable, eg. x[0], into MatLab, create an mxArray for it - Allocate the space (mxCreateDoubleMatrix) - Copy the value (memcpy) - Name the variable in the Engine (engPutVariable)
double x[0]; mxArray *m_X; m_X=mxCreateDoubleMatrix(1, 1, mxREAL); memcpy((void *)mxGetPr(m_X), (void *)x, sizeof(double)*1); engPutVariable(m_pEngine, "x", m_X);
Pointer m_pEngine is used to specify the engine Variable x in the MatLab Engine gets the value of x[0] in C++
To extract the MatLab Engines variable z, pull it into C++ as a mxArray matrix, then extract the bundled value out of that mxArray and into a C++ variable
double *cresult; mxArray *mresult; mresult = engGetVariable(m_pEngine,"z"); cresult = mxGetPr(mresult); cout << cresult[0];
z stored in the MatLab Engine Warning: Unpredictable fatal errors occur if the data type in MatLab doesnt closely resemble the data type in C++ eg. Copying a 3x1 vector into a scalar
To pass arrays (vector), adjust the size parameters of the memory allocation and copy routine to match the dimensions of the array being passed Pass a vector a of dimensions: 1 x SIZE
double a[SIZE]; mxArray *A; // assume a gets initialized, all values A=mxCreateDoubleMatrix(1, SIZE, mxREAL); memcpy((void *)mxGetPr(A), (void *)a, sizeof(double)*SIZE); engPutVariable(m_pEngine, "a", A);
Note: C++ has row-major storage, and MatLab has column-major storage. Thus a matrix being exchanged must be transposed, either before or after the exchange, to maintain the matrixs semantics
Demonstrates all of these features so far in Microsoft Visual Development Studio C++ v.6.0 Demonstrates graph plots, invoking commands, input, output, and passing vectors and matrices.
Internet References
http://www.sfu.ca/~zyao/teaching/ensc488faq.htm
http://prism.mem.drexel.edu/Shah/public_html/c2matlab.htm
Microsoft Visual Studio C++ & Interfacing Matlab with C/C++, Java
http://www.qcf.gatech.edu/academic/LabDataAccess/C++IntroductionMatLab.In terfacings.doc
http://www.mathworks.com.au/access/helpdesk/help/pdf_doc/matlab/apiext.pdf
Questions?
Thank You