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中包含的向量类定义: 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 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 filesmatlabr2009bexternincludematrix.h(332) : error C2371: 'char16_t' : redefinition; different basic types C:Program Files (x86)Microsoft Visual Studio 10.0VCINCLUDEyvals.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:poejemplosSAT_VecMat.h(69): could be 'Vector &Vector::operator =(const double)' d:poejemplosSAT_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:poejemplosSAT_VecMat.h(69): could be 'Vector &Vector::operator =(const double)' d:poejemplosSAT_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:poejemplosSAT_VecMat.h(69): could be 'Vector &Vector::operator =(const double)' d:poejemplosSAT_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:poejemplosSAT_VecMat.h(69): could be 'Vector &Vector::operator =(const double)' d:poejemplosSAT_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:poejemplosSAT_VecMat.h(69): could be 'Vector &Vector::operator =(const double)' d:poejemplosSAT_VecMat.h(70): or 'Vector &Vector::operator =(const Vector &)' while trying to match the argument list '(const Vector,double *)' C:PROGRA~1MATLABR2009BBINMEX.PL: Error: Compile of 'AccelSolrad.cpp' failed. 解决方法
更新:
至少有关char16_t的错误消息可能是由于您使用Visual Studio 2010和MATLAB R2009b这一事实.对于这个版本的MATLAB,该编译器太新了.见Supported Compilers list for R2009b. 关于其他错误不太清楚,但是: Vector& r_sat(3); 在我看来很可疑C:因为它是对向量的引用,你正在做的是创建一个大小为3的临时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 上一个答案: >您的Vector类是C,而不是C.>由于您使用的是Windows,因此MATLAB附带的lcc编译器是C编译器,它不了解C语言.如果您要编译C MEX文件,则需要运行mex -setup并选择支持的C编译器(通常是Visual Studio).> mex决定是否构建C或C MEX文件(影响它是否调用C或C编译器来进行实际编译和链接)的方式基于文件扩展名.所以将AccelSolrad.c重命名为AccelSolrad.cpp,你应该好好去. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |