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

c – 使用矢量类定义的Matlab的Mex文件,第1张

概述我正在尝试从C代码源文件创建一个Mex文件,以便与Matlab一起使用.由于我不太了解的向量类定义处理,我编译错误.我想知道如何修改代码才能工作.下面我将展示相关代码的各个部分,我将其分为四个部分以便进一步说明(计算代码,MexFunction代码,Vector类定义和编译错误): 计算例程的代码: #include "mex.h"#include "SAT_VecMat.h"void Ac 我正在尝试从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 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文件所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1160010.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存