将具有 OO 语法的 Matlab 转换为 c / c++ 而无需重写其功能

Posted

技术标签:

【中文标题】将具有 OO 语法的 Matlab 转换为 c / c++ 而无需重写其功能【英文标题】:Convert Matlab with OO syntax to c / c++ without rewriting it's functionality 【发布时间】:2012-12-21 11:08:51 【问题描述】:

我有 Matlab 代码使用 OO 语法,我需要将其转换为 C/C++ 源代码(不是二进制,而是源代码)。

我已经阅读了Level 2 S-Functions 和使用 Simulink Coder,但是

为“完全内联”TLC 编写 TLC (不想重写 TLC 中的完整例程)

在 TLC 中使用“基于函数的包装器”(不希望在 C 文件中实现例程)

不符合我的要求。

是否有其他选项可以从 Matlab 代码生成 C/C++ 源代码?

【问题讨论】:

好问题。实际上,这样的事情对我的项目非常有用。 您想要一个编译为“C/C++”的代码版本的动机是什么? 解决这个问题将使维护独立于matlab。如果您设计的东西要由别人维护,而您更喜欢编写 matlab 代码,则特别方便。 @Mankarse 1st 将此源代码添加到现有的 c++ 项目中。完整的项目在实时操作系统上运行。 (与操作系统细节链接,例如入口点)第二个是客户代码。我不会碰 可能重复:***.com/questions/7731671/converting-matlab-to-c 【参考方案1】:

可以从 OO 编写的 Matlab 脚本生成 C 代码。但是有必要在对象周围包装函数。你需要有 Matlab 编码器。

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.

【讨论】:

【参考方案2】:

它不是免费的,但 Mathworks 制作了一个名为 Matlab Coder 的产品,用于从 Matlab 代码生成 C++ 代码。

【讨论】:

谢谢,我会试试的。我将仔细研究它并研究它如何与 OO 语法一起工作。 MATLAB Coder 生成 C,而不是 C++ 代码,并且不适用于 MATLAB 对象。

以上是关于将具有 OO 语法的 Matlab 转换为 c / c++ 而无需重写其功能的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Matlab Coder 将 Matlab 代码转换为 C 代码

如何将结构从 Matlab 代码转换为 C 代码(使用 Matlab 编译器)

使用 Matlab Coder 将 C 字符数组转换为 Matlab 字符串

将增量为 25 的“for”循环从 C 转换为 MATLAB

将 C 字符数组转换为 Matlab 字符串 [Matlab 编码器]

如何将 MATLAB 中的 detectMSERFeatures 函数转换为 C?