计算例程的代码:
#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 rconst 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 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.解决方法 更新:
至少有关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
上一个答案:
>您的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,你应该好好去.
总结以上是内存溢出为你收集整理的c – 使用矢量类定义的Matlab的Mex文件全部内容,希望文章能够帮你解决c – 使用矢量类定义的Matlab的Mex文件所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)