Introduction
Matlab(c) is a well-known scientific software covering a wide range of engineering and mathematicals fields.
It contains also a set of complete and powerfull visualization tools.
Matlab(c) contains it's own language and you can easily develop applications on it. However, sometimes you will
want to run it from a C/C++ application and that's where everything get's tricky. In fact, although Matlab(c) comes with
a C API, it is complicated to use: linking problems, compiler special flags and other mysterious bugs (maybe I did it all wrong).
Another solution is to use the COM interface of the ActiveX control. The sad thing about this interface is that... it's COM and you end up with dozens of lines of code... That's where the CMatlabEngine
gets in the play. It hides all the COM code (getting CLSID, getting IDispatch, allocating variants, setting function arguments and many others) and enables you to focus on the main part of the job: use Matlab(c).
This article will discuss the main features the class, for further details check the Doxygen documentation
that is shipped with the demo project. Note that you can also generate it by running Doxygen on MatlabEngine.h
Initializing the engine
All the initialization code is contained in the constructor of CMatlabEngine
. You can check
that the server has been correctly initialized by calling IsInitialized
:
CoInitialize(NULL);
...
CMatlabEngine mt;
if (!mt.IsInitialized())
Do not forget to uninitialize COM when quitting the application:
CoUninitialize();
Engine main methods
The matlab engine contains 5 main methods:
Execute
,
PutMatrix
,
GetMatrix
,
PutString
and
GetString
Executing Matlab(c) code:
You can execute Matlab(c) code by calling Execute( LPCTSTR szMatlabCode )
:
mt.Execute(_T("surf(peaks)"));
mt.Execute(_T("title('demo')"));
Sending arrays to Matlab(c)
You can send array, real or complex, in the form of vector to Matlab(c) by using PutMatrix
.Note that the vector in PutMatrix have to be ordered line by lines: for a matrix M of size (mxn), M(i,j) is equivalent to M[i* n + j]
.
UINT nRows=10;
UINT nCols=2;
vector<double> v( nRows * nCols );
...
mt.PutMatrix( _T("M"), v, nRows, nCols);
Retreiving arrays from matlab
You can retreive arrays (real or complex) by calling GetMatrix( It is the dual of PutMatrix):
mt.Execute(_T("v=[1 2 3; 4 5 6]';"));
vector<double> vReal;
UINT nRows, nCols;
mt.GetMatrix(_T("v"), nRows, nCols, vReal);
nRows
and nCols
now contains the dimension of the array and vReal
the data.
Sending string to Matlab(c)
Piece of cake using PutString
:
mt.PutString("text", "Inserting a string named text");
Getting string from Matlab(c)
Use the method GetString
:
LPTSTR szText;
mt.GetString("myText",szText);
Note that
szText
is allocated on the heap by
GetString
, the memory cleaning is left to the user.
Workspace
You can modify the workspace you are working on by using
SetWorkspace
. By default, the workspace is
"base". If you want to declare global variables, use "global" workspace.
Handling the Matlab Window state
- Minimize the command window,
mt.MinimizeWindow();
- Maximize the command window,
mt.MaximizeWindow();
- Show, hide the command window,
mt.Show( true );
- Get the visibility state the command window,
if(mt.IsVisivle())
- Quit the command window,
mt.Quit();
Known bugs and limitations
Matlab 5.3 and earlier
Some function interface from the Matlab engine have been introduced only with the version 6.0 therefore user with version earlier than 6.0 would have faced problem with the class.
If you have a Matlab earlier than v6.0, undefine the MATLAB_VERSION_6 constant that is at the beginning of MatlabEngine.h, it will disable the following functions:
IsVisible, Show, PutString, GetString
Further developments
- Write
PutCellArray
and GetCellArray
to write and read cell arrays.
Reference and further reading
Revision History
21-10-2002 | Added references |
10-09-2002 |
GetString is now working! At last !
- Fixed bugs in
GetResult , GetMatrix
thanks to Juan Carlos Cobas.
|
09-25-2002 |
GetMatrix is now working! At last !
|
09-23-2002 |
- Added
PutString method
- Added MATLAB_VERSION_6 string for Matlab version < 6. Thanks for ZHANG Yan for finding the workaround.
|