Mex-файл Matlab с использованием определения векторного класса - PullRequest
3 голосов
/ 18 июня 2011

Я пытаюсь создать Mex-файл из исходного файла кода C ++, чтобы использовать его с 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. 

Ответы [ 2 ]

6 голосов
/ 18 июня 2011

Обновление:

По крайней мере, сообщение об ошибке char16_t, вероятно, связано с тем, что вы используете Visual Studio 2010 с MATLAB R2009b. Этот компилятор слишком новый для этой версии MATLAB. См. Список поддерживаемых компиляторов для R2009b .

Не слишком ясно о других ошибках, но:

 Vector& r_sat(3);

Мне кажется довольно сомнительным C ++: поскольку это ссылка на вектор, то, что вы делаете, создаете временный вектор с размером 3, затем инициализируете ссылку для ссылки на этот временный объект. Лучше просто объявить r_sat как Vector.

Тогда позже у вас будет:

r_sat = mxGetPr(prhs[0]);

Функция mxGetPr() возвращает указатель на двойной массив, но класс Vector не имеет operator=, который принимает double* в качестве аргумента.

Может быть, что-то вроде этого:

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

Предыдущий ответ:

  1. Ваш Vector класс - C ++, а не C.
  2. Поскольку вы работаете в Windows, компилятор lcc, который поставляется с MATLAB, является компилятором C, он не понимает C ++. Если вы собираетесь компилировать файлы C ++ MEX, вам нужно будет запустить mex -setup и выбрать поддерживаемый компилятор C ++ (обычно Visual Studio).
  3. Способ mex определяет, создаете ли вы MEX-файл C или C ++ (который влияет на то, вызывает ли он компилятор C или C ++ для фактической компиляции и компоновки), основан на расширении файла. Так что переименуйте AccelSolrad.c в AccelSolrad.cpp и вам будет хорошо идти.
1 голос
/ 05 августа 2011

Я думаю, что у меня может быть что-то .... хотя я никогда не работал с const obj& раньше.

Вы инстанцируете векторный класс в своем основном коде как константа:

const Vector& r_sat(3);

Затем вы пытаетесь присвоить вектору r_span массив. Поскольку r_span был объявлен константой, вы не можете. Вы должны сделать это как часть конструктора.

...