3

C / C ++ソースコード(バイナリではなくソース)に変換する必要があるOO構文を使用するMatlabコードがあります。

レベル2のS-FunctionとSimulinkCoderの使用について読みましたが

  • 「完全にインライン化」するTLC用のTLCの記述 (TLCで完全なルーチンを書き直すことは望ましくありません)

    また

  • TLCで「関数ベースのラッパー」を使用する (Cファイルにルーチンを実装することは望ましくありません)

私の要件を満たしていません。

MatlabコードからC/C ++ソースを生成する他のオプションはありますか?

4

2 に答える 2

3

オブジェクト指向で記述されたMatlabスクリプトからCコードを生成することが可能です。ただし、オブジェクトの周りに関数をラップする必要があります。MatlabCoderが必要です。

Matlabは、値クラスとハンドルクラス(ハンドルから派生するすべてのクラス)を区別します。

1.クラスを処理する

1.1。例

classdef myHandleClass < handle
properties (Access=private)
    num1;
end
   methods (Access=public)
       function obj = myHandleClass (num1) 
       % constructor
           if(nargin > 0)
             obj.num1=num1;
           end
       end
       function prod = product(obj, factor)
          prod = obj.num1.*factor;
       end
       function quot = quotient(obj,divisor)
           quot = obj.num1/divisor;
       end
   end
end 

1.2。ハンドルクラスを使用した関数

myHandleClassのオブジェクトは永続的である必要があります。また、isempty関数は必須です。

     %#codegen   
     function prod= use_product_HandleClass(a,b)
     assert(isa(a,'double'));
     assert(isa(b,'double'));

     persistent p;  
      if isempty(p)
         p = myHandleClass(a);
      end

     prod = p.product(b);
     end

1.3。生成されたコード

これは、生成された「use_product_HandleClass.c」の中で最も興味深い部分です。

typedef struct {
  real_T num1;
} myHandleClass;

#endif                                 /*typedef_myHandleClass*/

/* Named Constants */

/* Variable Declarations */

/* Variable Definitions */
static myHandleClass p;

/* Function Declarations */

/* Function Definitions */
real_T use_product_HandleClass(real_T a, real_T b)
{
  if (!p_not_empty) {
    p.num1 = a;
    p_not_empty = TRUE;
  }

  return p.num1 * b;
}

2.バリュークラス

2.1。バリュークラスの例

   classdef myValueClass 
       properties (Access=private)
            num1;
       end
       methods (Access=public)
           function obj = myValueClass (num1) 
               if(nargin > 0)
                 obj.num1=num1;
               end
           end
           function prod = product(obj, factor)
              prod = obj.num1.*factor;     
           end
           function quot = quotient(obj,divisor)
               quot = obj.num1./divisor;
           end
       end
   end  

2.2。値クラスを使用する関数

%#codegen
function res= use_product_ValueClass(a,b)
  assert(isa(a, 'double'))
  assert(isa(b, 'double'))
  p = myValueClass(a);
  res = p.product(b);
end

2.3。生成されたコード

これは、生成された「use_product_ValueClass.c」の中で最も興味深い部分です。

/* Function Definitions */
real_T use_product_ValueClass(real_T a, real_T b)
{
  return a * b;
}

3.参考文献

「MATLAB値クラスのコードを生成する」。
http://www.mathworks.de/de/help/coder/ug/how-to-generate-code-for-matlab-value-classes.html

「MATLABハンドルクラスとシステムオブジェクトのコードを生成する」。

http://www.mathworks.de/de/help/coder/ug/how-to-generate-code-for-matlab-handle-classes.html

于 2013-03-08T15:16:46.187 に答える
2

無料ではありませんが、Mathworksは、MatlabコードからC++コードを生成するため のMatlabCoderと呼ばれる製品を作成しています。

于 2012-12-21T13:01:52.720 に答える