3

C++ コード ソース ファイルから Mex ファイルを作成して、Matlab で使用しようとしています。ベクトルクラスの定義の扱いがよくわからないため、コンパイルエラーが発生します。コードを修正して機能させる方法を知りたいです。以下に、より明確にするために 4 つのセクション (計算コード、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_tMATLAB R2009b で Visual Studio 2010 を使用しているため、エラー メッセージが表示される可能性があります。そのコンパイラは、このバージョンの MATLAB には新しすぎます。R2009bでサポートされているコンパイラのリストを参照してください。

他のエラーについてはあまり明確ではありませんが、次のとおりです。

 Vector& r_sat(3);

私にはかなり疑わしいC++のようです:これはベクトルへの参照であるため、サイズ3の一時的なベクトルを作成し、参照を初期化してその一時的なものを参照しています。r_satとして宣言する方が良いVectorです。

その後、次のようになります。

r_sat = mxGetPr(prhs[0]);

この関数は double 配列へのポインターを返しますが、Vector クラスには引数としてa を取るmxGetPr()an がありません。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. C または C++ MEX ファイルをビルドするかどうかを決定する方法mex(これは、実際のコンパイルとリンクを行うために C または C++ コンパイラを呼び出すかどうかに影響します) は、ファイル拡張子に基づいています。に名前を変更AccelSolrad.cするAccelSolrad.cppと、準備完了です。
于 2011-06-18T05:38:18.480 に答える