加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 09:35:32 所属栏目:百科 来源:网络整理
导读:我正在尝试从C代码源文件创建一个Mex文件,以便与Matlab一起使用.由于我不太了解的向量类定义处理,我编译错误.我想知道如何修改代码才能工作.下面我将展示相关代码的各个部分,我将其分为四个部分以便进一步说明(计算代码,MexFunction代码,Vector类定义和编译
我正在尝试从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声明为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,你应该好好去.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读