Introduction
In the previous article,
we studied how can use MATLAB C API to solve engineering problems. In
this article I will show you how can use MATLAB C++ math library. The
MATLAB� C++ Math Library serves two separate constituencies: MATLAB
programmers seeking more speed or complete independence from interpreted
MATLAB, and C++ programmers who need a fast, easytouse matrix math
library. To each, it offers distinct advantages.
MATrix LABoratory
MATLAB is abbreviation of Matrix Laboratory. This means every
computation was performed in matrix form. In other hand every data type
wrapped in matrix form and every function take these matrix as an input
argument.
For example you want to multiply to polynomial as follow:
A = (3x^{2} + 5x + 7) (4x^{5} + 3x^{3}  x^{2} + 1)
You can use two matrices for coefficients of any polynomials:
[3 5
for
7](3x^{2} +
and
5x + 7)[4 0 3 1 0 1]
for (4x^{5} + 3x^{3}  x^{2} + 1)
, using conv
function,
we can obtain coefficients of result:
conv([3 5 7], [4 0 3 1 0 1]): A = [12 20 37 12 16 4 5 7]
means:
A = 12x^{7} + 20x^{6} + 37x^{5} + 12x^{4} + 16x^{3}  4x^{2} + 5x + 7
C++ Math Library
The MATLAB C++ Math Library consists of approximately 400 MATLAB math
functions. It includes the builtin MATLAB math functions and many of
the math functions that are implemented as MATLAB Mfiles. The MATLAB
C++ Math Library is layered on top of the MATLAB C Math Library. The
major value added by this C++ layer is ease of use.
The MATLAB C++ Math Library is firmly rooted in the traditions of the
MATLAB runtime environment. Programming with the MATLAB C++ Math
Library is very much like writing Mfiles in MATLAB. While the C++
language imposes several differences, the syntax used by the MATLAB C++
Math Library is very similar to the syntax of the MATLAB language. Like
MATLAB, the MATLAB C++ Math Library provides automatic memory
management, which protects the programmer from memory leaks.
Every matrices represented by mwArray
class, a data type
introduced by MATLAB for
constructing a matrix. As I said before, every data must be wrapped in a
matrix form in other hand: mwArray.
One C++ prototype supports all the possible ways to call a particular
MATLAB C++ Math Library
function. You can reconstruct the C++ prototype by examining the MATLAB syntax for a function. In
the following procedure, the MATLAB
function svd()
is used to illustrate the process.
MATLAB Syntax
s = svd (X)
[U, S, V] = svd (X)
[U, S, V] = svd (X, 0)
In this example, the prototype that corresponds to [U, S, V] = svd
(X, 0) is constructed stepbystep. Until the last step, the prototype
is incomplete.
Adding the Output Arguments
 Subtract out the first output argument, U, to be the return value
from the function. The data type for the return value ismwArray
.CollapsemwArray svd(
 Add the remaining number of output arguments, S and V, to the
prototype as the first, second, etc., arguments to the function. The
data type for an output argument ismwArray
*.CollapsemwArray svd (mwArray* S, mwArray* V,
Adding the Input Arguments
 Add the number of input arguments to the prototype, X and Zero, one
after another following the output arguments. The data type for an input
argument ismwArray
.CollapsemwArray svd (mwArray* S, mwArray* V, const mwArray& X,
const mwArray& Zero);
The prototype is complete.
How to Translate a MATLAB Call into a C++ Call
This procedure translates the MATLAB call [U, S, V] = svd (X, 0)
into a C++ call. The procedure
applies to library functions in general. Note that within a call to a
MATLAB C++ Math Library function, an output argument is preceded by
&; an input argument is not.
 Declare input, output, and return variables as
mwArray
variables, and assign values to the input variables.  Make the first MATLAB output argument the return value from the
function.CollapseU = svd (
 Pass any other output arguments as the first arguments to the
function.CollapseU = svd (&S, &V,
 Pass the input arguments to the C++ function, following the
output arguments.CollapseU = svd (&S, &V, X, 0);
The translation is complete.
Note that if you see [] as a MATLAB input argument, you should pass mwArray()
as the C++ argument. For example,
B = cplxpair (A, [], dim)
becomes
B = cplxpair (A, mwArray(), dim);
mwArray class
The mwArray
class public interface is relatively small,
consisting of constructors and destructor, overloaded new and delete
operators, one userdefined conversion, four indexing operators, the
assignment operator, input and output operators, and array size query
routines. The mwArray
�s public interface does not contain
any mathematical operators or functions.
Constructors
The mwArray
interface provides many useful constructors.
You can construct a mwArray
object from the following
types of data: a numerical scalar, an array of scalars, a string, an mxArray*
,
or another mwArray
object.
mwArray()
Create an uninitialized array. An uninitialized array produces
warnings when passed to MATLAB C++ Math Library functions. If an array
is created using this default constructor, a value must be assigned to
it before passing it to a MATLAB C++ Math Library function.
To create an empty double matrix that corresponds to [] in MATLAB,
use the
function empty()
.
mwArray (const char *str)
Create an array from a string. The constructor copies the string.
mwArray(int32 rows, int32 cols, double
*real, double *imag = NULL)
Create a mwArray
from either one or two arrays of
doubleprecision floatingpoint numbers. If two arrays are specified,
the constructor creates a complex array; both input arrays must be the
same size. The data in the input arrays must be in columnmajor order,
the reverse of C++�s usual rowmajor order. This constructor copies the
input arrays.
Note that the last argument, imag, is assigned a value of NULL in the
constructor. imag
is an optional argument. When you call
this constructor, you do not need to specify the optional argument.
mwArray (const mwArray&
mtrx)
Copy a mwArray
. This constructor is the familiar C++
copy constructor, which copies the input array. For efficiency, this
routine does not actually copy the data until the data is modified. The
data is referenced through a pointer until a modification occurs.
mwArray (const mxArray* mtrx)
Make a mwArray
from an mxArray
*, such as
might be returned by any of the routines in the MATLAB C Math Library or
the Application Program Interface Library. This routine does not copy
its input array, yet the destructor frees it; therefore the input array
must be allocated on the heap. In most cases, for example, with matrices
returned from the Application Program Interface Library, this is the
desired behavior.
mwArray (double start, double step, double
stop)
Create a ramp. This constructor operates just like the MATLAB colon
(:) operator. For example, the call mwArray(1, 0.5, 3)
creates the vector [ 1, 1.5, 2, 2.5, 3 ]
.
mwArray (int32 start, int32 step, int32 stop)
Create an integer ramp.
mwArray (const mwSubArray
& a)
Create an mwArray
from an mwSubArray
. When
an indexing operation is applied to an array, the result is not another
array, but an mwSubArray
object. An mwSubArray
object
remembers the indexing operation. Evaluation of the operation is
deferred until the result is assigned or used in another expression.
This constructor evaluates the indexing operation encoded by the mwSubArray
object and creates the appropriate array.
mwArray (double)
Create
a 1by1 mwArray
from a doubleprecision floatingpoint
number.
mwArray (int)
Create
an mwArray
from an integer.
Table 1 shows mwArray
constructors in brief.
Constructor  Creates  Example 


Uninitialized array 


String array 


Complex array 


Copy of input array 


Copy of mxArray* 


Ramp 


Integer ramp 


Array from subarray (used in indexing) 


Scalar double array 


Scalar integer array 

Mathematical Functions
Below is a list of useful mathematical functions of MATLAB C++ math
library:
plus, minus  mtimes, mpower  acos, asin  conv 
conj  dec2bin, dec2hex  disp  fft, fft2 
linspace  max, min  roots  rot90 
Using C++ Math Library
To add support of MATLAB C++
Math Library follow these instructions:\
 Add following line at the end of stdafx.h
Collapse
#include <matlab.hpp>
matlab.hpp is interface of MATLAB
C++ math library. Add directory of MATLAB
interface files (*.hpp) to Visual Studio (Tools > Options >
Directories). For example: x:\matlab\extern\include\cpp, where x
is drive letter of matlab path.  Add desired libraries to your project (In this example, libmatpm.lib)
 Compile your project!
Sample Program
#include "stdafx.h"
#include "matlab.hpp" //Interface of MATLAB CPP Math Library
//Add C++ Math Library to project
#pragma comment(lib, "libmatpm.lib")
#pragma comment(lib, "libmx.lib")
#pragma comment(lib, "libmatlb.lib")
#pragma comment(lib, "libmat.lib")
#pragma comment(lib, "libmmfile.lib")
#pragma comment(lib, "libmatpm.lib")
int main(int argc, char* argv[])
{
mwArray A, B, C;
A = magic(mwArray(5));
B = transpose(A); //B=A'
C = plus(A,B); //C = A + B;
C = minus(A,B); //C = A  B;
C = mtimes(A,B); //C = A * B;
double arr1[]={3.0, 2.0, 5.0, 1.0};
double arr2[]={8.0, 1.0, 3.0, 2.0};
mwArray D(1, 4, arr1);
mwArray E(4, 1, arr2);
C = D * E; //4*4 matrix mwArray
F(0.0, 0.1, 5.0); //create double ramp
F = F * transpose(F);
A.Print("A"); //Magic Matrix, Order=5
C.Print("C");
D.Print("D");
return 0;
}
Known Problems
 Compiler reports error when compiling matlab.hpp:
Collapse
c:\matlab\extern\include\cpp\matmtxif.h (16):
fatal error C1083: Cannot open include file strstream.h.
No such file or directory.This error is due to missing preprocessor definitions in the MSVC
environments. In order to alleviate this problem, the following
definitions must be added to the project file for the application: MSVC
 MSWIND
 IBMPC
 D__STDC_
Add these preprocessors to your project:
Project>Settings>C/C++>Preprocessor definitions.  Linker reports error when linking MATLAB library files:
Collapse
LINK : warning LNK4098: defaultlib "MSVCRT" conflicts with use of other libs;
use /NODEFUALTLIB:library
.\ex1.exe : fatal error LNK1169: one or more multiply defined symbols found
Error executing link.exeTo resolve this problem change project settings to build a
Multithread Dll in the Runtime Library. Do this by following these
instructions: Selecting Project from the main menu
 Selecting Settings
 Clicking on C/C++ tab
 Selecting Code Generation in the Category pulldown menu
 In the Runtime Library field selecting Multithread Dll (“Debug
Multithread Dll” will not work)  Click OK
 Rebuild your project
Requirements
References
Enjoy!
License
This article has no explicit license
attached to it but may contain usage terms in the article text or the
download files themselves. If in doubt please contact the author via the
discussion board below.
A list of licenses authors might use can
be found here
About the Author
A. Riazi
Member 
I was born in Shiraz, a very beautiful famous city in Iran. I started programming when I was 12 years old with GWBASIC. Since now, I worked with various programming languages from Basic, Foxpro, C/C++, Visual Basic, Pascal to MATLAB and now Visual C++. I graduated from Iran University of Science & Technology in Communication Eng., and now work as a system programmer for a telecommunication industry. I wrote several programs and drivers for Synthesizers, Power Amplifiers, GPIB, GPS devices, Radio cards, Data Acqusition cards and so many related devices. I’m author of several books like Learning C (primary and advanced), Learning Visual Basic, API application for VB, Teach Yourself Object Oriented Programming (OOP) and etc. I’m winner of January, May, August 2003 and April 2005 best article of month competetion, my articles are: You can see list of my articles, by clicking here
