简体   繁体   中英

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 the Supported 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:

  1. Your Vector class is C++, not C.
  2. 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 run mex -setup and pick a supported C++ compiler (typically, Visual Studio).
  3. 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 rename AccelSolrad.c to AccelSolrad.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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM