使用矢量类定义的Matlab Mex文件

时间:2011-06-18 01:35:13

标签: c++ matlab mex

我正在尝试从C ++代码源文件创建一个Mex文件,以便与Matlab一起使用。由于我不太了解的向量类定义处理,我编译错误。我想知道如何修改代码才能工作。下面我将展示相关代码的各个部分,我将其分为四个部分以便进一步说明(计算代码,MexFunction代码,Vector类定义和编译错误):

计算例程的代码:

#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的代码:

...
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]);

SAT_VecMat.h中包含的Vector类定义:

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;
...

编译错误:

    >> 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. 

2 个答案:

答案 0 :(得分:6)

更新

至少有关char16_t的错误消息可能是由于您使用Visual Studio 2010和MATLAB R2009b这一事实。对于这个版本的MATLAB,该编译器太新了。请参阅Supported Compilers list for R2009b

不太清楚其他错误,但是:

 Vector& r_sat(3);

对我来说似乎很可疑C ++:因为它是对向量的引用,你正在做的是创建一个大小为3的临时Vector,然后初始化引用以引用那个临时的。 最好将r_sat声明为Vector

然后你有:

r_sat = mxGetPr(prhs[0]);

mxGetPr()函数返回一个指向double数组的指针,但Vector类没有operator=,它以double*为参数。

也许是这样的:

r_sat = Vector(mxGetPr(prhs[0]), 3); // use the Vector(double*, int N) constructor

上一个答案:

  1. 您的Vector类是C ++,而不是C.
  2. 由于您使用的是Windows,因此MATLAB附带的lcc编译器是C编译器,它不了解C ++。如果您要编译C ++ MEX文件,则需要运行mex -setup并选择支持的C ++编译器(通常是Visual Studio)。
  3. mex决定是否构建C或C ++ MEX文件(影响它是否调用C或C ++编译器进行实际编译和链接)的方式基于文件扩展名。因此,将AccelSolrad.c重命名为AccelSolrad.cpp,您应该很高兴。

答案 1 :(得分:1)

我想我可能会有一些东西......虽然我之前从未与const obj&合作过。

您将主代码中的矢量类实例化为常量:

const Vector& r_sat(3);

然后你试图将向量r_span分配给一个数组。由于r_span被声明为常量,你不能。您必须将其作为构造函数的一部分。