3

我正在尝试从 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 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. 
4

2 回答 2

6

更新:

至少有关的错误消息char16_t可能是由于您将 Visual Studio 2010 与 MATLAB R2009b 一起使用。那个编译器对于这个版本的 MATLAB 来说太新了。请参阅R2009b 支持的编译器列表

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

 Vector& r_sat(3);

在我看来,C++ 非常可疑:因为它是对向量的引用,所以您正在做的是创建一个大小为 3 的临时向量,然后初始化引用以引用该临时向量。最好只声明r_satVector.

然后你有:

r_sat = mxGetPr(prhs[0]);

mxGetPr()函数返回一个指向双精度数组的指针,但 Vector 类没有operator=将 adouble*作为参数的 a。

也许是这样的:

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

上一个答案:

  1. 您的Vector课程是 C++,而不是 C。
  2. 由于您在 Windows 上,lccMATLAB 附带的编译器是 C 编译器,它不理解 C++。如果要编译 C++ MEX 文件,则需要运行mex -setup并选择受支持的 C++ 编译器(通常是 Visual Studio)。
  3. mex决定您是构建 C 还是 C++ MEX 文件的方式(这会影响它是否调用 C 或 C++ 编译器来进行实际编译和链接)基于文件扩展名。所以重命名AccelSolrad.cAccelSolrad.cpp,你应该很高兴。
于 2011-06-18T05:38:18.480 回答
1

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

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

const Vector& r_sat(3);

然后,您尝试为向量 r_span 分配一个数组。由于 r_span 被声明为常量,因此您不能。作为构造函数的一部分,您必须这样做。

于 2011-08-05T09:30:06.413 回答