Matlab's Mex-file using a vector class definition
I am trying to create a Mex-file from a C++ code source file to use开发者_运维技巧 it with Matlab. I have compiling errors due to the vector class definition handling that I do not understand very well. I would like to know how I should modify the code to work. Below I show the relevant code's parts that I have divided into four sections for clarifying more (Computational code, MexFunction code, Vector class definition and compiling errors):
Computational routine's code:
#include "mex.h"
#include "SAT_VecMat.h"
void AccelSolrad (const Vector& r, const Vector& r_Sun, double Area, double mass,
double CR, double P0, double AU,const Vector& Accel )
mexFunction's code:
...
const Vector& r_sat(3); // dummy argument name for r
const Vector& r_sol(3); // dummy argument name for r_Sun
const Vector& outMatrix(3); // dummy argument name for Accel
...
r_sat = mxGetPr(prhs[0]);
r_sol = mxGetPr(prhs[1]);
plhs[0] = mxCreateDoubleMatrix(1,3,mxREAL);
outMatrix = mxGetPr(plhs[0]);
Vector class definition included in SAT_VecMat.h:
class Vector
{
public:
friend class Matrix;
// Constructors
Vector (); // Vector without elements
Vector (int Size); // Nullvector of specified size
Vector (const Vector& V); // Vector copy
Vector (const double* p, int N); // Array copy
Vector (double x, double y, double z); // 3dim-Vector
Vector (double x, double y, double z, // 6dim-Vector
double X, double Y, double Z);
// Destructor
~Vector();
// Size
int size() const { return n; };
Vector& resize(int Size);
// Assignment
Vector& operator=(const double value);
Vector& operator=(const Vector& V);
// Component access (Fortran notation)
double operator () (int i) const { return v[i]; };
double& operator () (int i) { return v[i]; };
Vector slice (int first, int last) const;
...
Compiling errors:
>> mex AccelSolrad.cpp
AccelSolrad.cpp
c:\program files\matlab\r2009b\extern\include\matrix.h(332) : error C2371: 'char16_t' : redefinition; different basic types
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\yvals.h(576) : see declaration of 'char16_t'
AccelSolrad.cpp(14) : error C2678: binary '=' : no operator found which takes a left-hand operand of type 'const Vector' (or there is no acceptable conversion)
d:\po\ejemplos\SAT_VecMat.h(69): could be 'Vector &Vector::operator =(const double)'
d:\po\ejemplos\SAT_VecMat.h(70): or 'Vector &Vector::operator =(const Vector &)'
while trying to match the argument list '(const Vector, Vector)'
AccelSolrad.cpp(18) : error C2678: binary '=' : no operator found which takes a left-hand operand of type 'const Vector' (or there is no acceptable conversion)
d:\po\ejemplos\SAT_VecMat.h(69): could be 'Vector &Vector::operator =(const double)'
d:\po\ejemplos\SAT_VecMat.h(70): or 'Vector &Vector::operator =(const Vector &)'
while trying to match the argument list '(const Vector, Vector)'
AccelSolrad.cpp(94) : error C2678: binary '=' : no operator found which takes a left-hand operand of type 'const Vector' (or there is no acceptable conversion)
d:\po\ejemplos\SAT_VecMat.h(69): could be 'Vector &Vector::operator =(const double)'
d:\po\ejemplos\SAT_VecMat.h(70): or 'Vector &Vector::operator =(const Vector &)'
while trying to match the argument list '(const Vector, double *)'
AccelSolrad.cpp(96) : error C2678: binary '=' : no operator found which takes a left-hand operand of type 'const Vector' (or there is no acceptable conversion)
d:\po\ejemplos\SAT_VecMat.h(69): could be 'Vector &Vector::operator =(const double)'
d:\po\ejemplos\SAT_VecMat.h(70): or 'Vector &Vector::operator =(const Vector &)'
while trying to match the argument list '(const Vector, double *)'
AccelSolrad.cpp(112) : error C2678: binary '=' : no operator found which takes a left-hand operand of type 'const Vector' (or there is no acceptable conversion)
d:\po\ejemplos\SAT_VecMat.h(69): could be 'Vector &Vector::operator =(const double)'
d:\po\ejemplos\SAT_VecMat.h(70): or 'Vector &Vector::operator =(const Vector &)'
while trying to match the argument list '(const Vector, double *)'
C:\PROGRA~1\MATLAB\R2009B\BIN\MEX.PL: Error: Compile of 'AccelSolrad.cpp' failed.
Update:
At least the error message about char16_t
is likely due to the fact that you are using Visual Studio 2010 with MATLAB R2009b. That compiler is too new for this version of MATLAB. See theSupported Compilers list for R2009b.
Not too clear about the other errors, but:
Vector& r_sat(3);
Seems to me to be pretty questionable C++: Since it is a reference to a vector, what you are doing is creating a temporary Vector with size 3, then initializing the reference to refer to that temporary.
Better to just declare r_sat
as Vector
.
Then later you have:
r_sat = mxGetPr(prhs[0]);
The mxGetPr()
function returns a pointer to a double array, but the Vector class does not have an operator=
that takes a double*
as an argument.
Maybe something like this:
r_sat = Vector(mxGetPr(prhs[0]), 3); // use the Vector(double*, int N) constructor
Previous answer:
- Your
Vector
class is C++, not C. - Since you are on Windows, the
lcc
compiler that ships with MATLAB is a C compiler, it does not understand C++. If you are going to be compiling C++ MEX files, you will need to runmex -setup
and pick a supported C++ compiler (typically, Visual Studio). - The way
mex
decides whether you're building a C or C++ MEX file (which influences whether it invokes the C or C++ compiler to do the actual compiling and linking) is based on the file extension. So renameAccelSolrad.c
toAccelSolrad.cpp
and you should be good to go.
I think I might have something....though I've never worked with const obj&
before.
You're instancing the vector class in your main code as a constant:
const Vector& r_sat(3);
Then you're trying to assign to the vector r_span an array. Since r_span was declared constant you can't. You have to do that as part of the constructor.
精彩评论