Chinaunix首页 | 论坛 | 博客
  • 博客访问: 83037
  • 博文数量: 9
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 102
  • 用 户 组: 普通用户
  • 注册时间: 2013-09-02 00:47
文章分类

全部博文(9)

文章存档

2014年(4)

2013年(5)

我的朋友

分类: C/C++

2013-11-05 21:11:37

  MATLAB  Coder? 可以从MATLAB?代码生成独立的、可读性强、可移植的C /C++代码。MATLAB Coder 支持程序控制结构,函数和矩阵操作。它可以生成MEX函数,该函数可以加速MATLAB代码的运行速度并且验证生成代码的属性。MATLAB Coder?结合 Simulink Coder?和 Embedded Coder?可以将含有MATLAB代码的Simulink?模型生成C代码,生成的C代码可以用来:


  • 单独执行
  • 与其他软件集成
  • 加速仿真MATLAB算法
  • 实现嵌入式系统


特点:


  • 生成符合ANSI/ISO标准的C / C++ 代码;
  • 可以对定点和浮点数学运算生成MEX函数;
  • 可以利用工程管理工具来确定输入点和输入数据属性以及代码生成的配置选项;
  • 可为变大小的数据提供静态或动态内存存储位置;
  • 代码生成支持Communications System Toolbox?, DSP System Toolbox?, 和Computer Vision System Toolbox?许多函数和系统对象;
  • 支持一般的MATLAB语言行为,包括矩阵操作,下标操作,程序控制语句(if,switch,for,while)以及结构体。



MATLAB Coder  工程管理界面(左)和代码生成报告(右),该报告显示了生成的C代码.

强大的功能

 ■   可生成代码的MATLAB 语言子集

      MATLAB Coder可以针对某些MATLAB 语言生成代码,这些语言一般都是设计工程师在开发大型系统的算法时经常用到的。这些支持的子集包括超过400个操作符和MATLAB中的函数。

      MATLAB Coder支持对Aerospace Toolbox,Image Processing Toolbox?和Signal Processing Toolbox?中的部分函数生成代码,而且支持对Communications System Toolbox?,Computer Vision System Toolbox?和DSP System Toolbox?中的系统对象生成代码。

      MATLAB Coder支持开发算法时用到的大部分MATLAB语言,包括:


  • 矩阵和数组:比如持续变量,全局变量,矩阵操作,N维数组,下标操作和帧
  • 类和数据类型:比如复数, 整形数据匹配,单精度双精度,定点运算,字符,结构体,数值类和变长度数据
  • 编程结构:比如MATLAB程序控制结构(if, for, while, switch)和数学运算,逻辑关系操作符
  • 函数:比如函数句柄,子函数和部分MATLAB函数,变长度输入和输出声明列表和子函数的调用


 ■   MATLAB Coder的应用

      MATLAB Coder的应用通过使用MATLAB Coder,设计工程师可以在MATLAB中开发算法,然后生成可读性强和可移植的C/C++代码,利用该代码可以:


  • 将MATLAB算法生成在PC机上可以运行的可执行文件;
  • 可以通过用自动生成的MATLAB可执行文件(MEX函数)替换MATLAB代码来加快仿真速度,MEX函数就是调用编译好的C/C++代码;
  • 可以将MATLAB算法作为一个编译好的库集成到其他的软件中;
  • 可以在嵌入式处理器中执行和验证MATLAB算法。



MATLAB Coder应用情况

 ■   从MATLAB中生成代码

      将MATLAB语言转换成C代码在执行过程中需要确定一定的要求,MATLAB Coder可以在MATLAB语言环境中指导你完成这个过程。由于MEX函数需要调用编译好的C代码,所以可以通过生成MEX函数,然后在MATLAB中运行该函数来确保你的算法符合代码生成规则。MATLAB    Coder 生成一个报告,这个报告中会指出在从MATLAB算法到生成代码过程中必须改正的错误。通过不断的修正错误、生成MEX函数这种迭代过程直到MATLAB算法满足代码生成的要求,这时就可以生成C/C++的源代码或者MEX函数了。

C 或者C++源代码可以用来:


  • 将MATLAB算法生成在PC机上可以运行的可执行文件;
  • 创建一个库;
  • 作为嵌入式代码运行。


MEX文件可以代替MATLAB代码被调用:


  • 可以在MATLAB中验证编译后的代码
  • 加速执行速度



通过使用MATLAB Coder从MATLAB生成代码的三步迭代流程

 ■   MATLAB Coder 、Simulink Coder和Embedded Coder

      用于仿真的MATLAB  Function模块和代码生成可以让你将MATLAB算法生成算法集成到Simulink模型中。Simulink Coder可以将这些Simulink包含MATLAB代码的模型生成代码。


Simulink中的雷达跟踪模型,这个模型使用MATLAB Function模块
在这个模块中有用MATLAB编写的卡尔曼滤波算法

      Embedded Coder可以针对支持的嵌入式处理器、面向目标的快速控制原型板,及微处理器的需要和微处理器生成代码,它提供了配置选项和可以更好的控制生成代码的函数、文件和数据的高级优化选项,因此它扩展了MATLAB Coder和Simulink Coder。Embedded Coder 提高了代码效率,并且能很方便的集成已有代码,数据类型和产品中的标定参数。

      使用Embedded Coder生成的代码,可以导出到第三方的开发环境中,可以在嵌入式系统中自动创建可执行文件。生成的代码可以在处理器上执行用来验证性能,可以通过PIL仿真和代码剖析的方法来查看代码在硬件上的运行情况。

MATLAB Coder可以从MATLAB代码生成独立的、可读性强、可移植的C/C++代码。

使用MATLAB Coder产生代码的3个步骤:准备用于产生代码的MATLAB算法;检查MATLAB代码的兼容性(有些matlab代码语句并不能生成c/c++代码);产生最终使用的源代码或MEX。

利用MATLAB Coder生成c++代码,并在vs2008中验证:

一个简单的例子,两数相乘

1、安装matlab2011a或者更新版本;

2、简单生成一个foo.m文件;

function c = foo(a, b)%#codegen

%This function muliplies a and b

c = a * b

其中,%#codegen可以防止出现警告错误

3、在命令窗口,输入mex -setpu,选中一个存在的编译器;

4、在命令窗口输入coder(图形界面),回车,弹出MATLAB Coder Project对话框;

5、在New选项卡Name中输入一个工程名foo.prj;点击Ok,弹出MATLAB Coder MEX Function对话框;

6、在Overview选项卡中,点击Add files,弹出对话框,选中foo.m打开;

7、单击变量a,选择Define by Example…,弹出MATLAB Coder Define by Example对话框,在MATLAB Expression中输入5,点击OK;同样变量b也进行相应操作,输入6;

8、选中Build选项卡,Output type中选择c/c++ Static Library;选中Generate code only;

9、点击More settings,GeneralàLanguage选择C++;Interface选项中去掉所有选项;Close;

10、点击Build,进行编译;点击View report,弹出Code Generation Report对话框,此时,变量a、b、c会显示相应的变量信息;

11、利用codeblocks建立一个控制台应用程序,将生成的相关文件foo.h、foo.cpp、rtwtypes.h、foo_types.h等文件拷到相关目录下并添加到应用程序中;

12、在foo.cpp文件中添加#include “stdafx.h”;

13、test.cpp文件中代码为:

#include "stdafx.h"

#include "foo.h"

#include


using namespace std;


int _tmain(int argc, _TCHAR* argv[])

{


double a = 0.0, b = 0.0, c = 0.0;


cin>>a>>b;


c = foo(a, b);


cout<<"c = "<


return 0;

}


一个复杂的例子,求一个数的n次方根

1、  两个.m文件:

nrt.m:

function [nth_rt, iterations, hstry] = nrt(varargin)%#codegen

%This function will use a Newton Search Technique to find

%the nth root of a number, a, to the tolerance, tol.

%The square root

% nrt(10, 2), or nrt(10, 2, 1e-9)

%The "n" root

%nrt(10, n), or nrt(10, n, 1e-9)


a = varargin{1};

n = varargin{2};


if nargin ~= 3

tol = 1e-9;

else

tol = varargin{3};

end


if a < 0

nth_rt = 0;

iterations = 0;

hstry = 0;

else

[nth_rt, hstry] = newtonSearchAlgorithm(a, n, tol);

iterations = length(find(hstry ~= 0));

%iterations = sum(hstry ~= 0);

end


newtonSearchAlgorithm.m

function [x, h] = newtonSearchAlgorithm(b, n, tol) %#codegen

%Given, "a", this function finds the nth root of a

%number by finding where: x^n-a = 0

coder.inline('never'); %使其生成一个单独的c++文件

notDone = 1;

aNew    = 0; %Refined Guess Initialization

a       = 1; %Initial Guess

cnt     = 0;

h = zeros(50, 1);

h(1)    = a;

while notDone

cnt = cnt + 1;

[curVal, slope] = f_and_df(a, b, n); %  square

yint = curVal - slope * a;

aNew = -yint / slope; %The new guess

h(cnt) = aNew;

if (abs(aNew-a) < tol) %Break if it's converged

notDone = 0;

elseif cnt > 49 %after 50 iterations, stop

notDone = 0;

aNew = 0;

else

a = aNew;

end

end

x = aNew;


function [f, df] = f_and_df(a, b, n)

%Our function is f=a^n-b and it's derivative is n*a^(n-1).


f  = a^n-b;

df = n*a^(n-1);


2、  在命令窗口输入coder(图形界面),回车,弹出MATLAB Coder Project对话框;

3、在New选项卡Name中输入一个工程名nrt.prj;点击Ok,弹出MATLAB Coder MEX Function对话框;

4、在Overview选项卡中,点击Add files,弹出对话框,选中nrt.m打开;

5、添加三个输入,分别为10、2、1e-9;两个输入也可以;

6、选中Build选项卡,Output type中选择c/c++ Static Library;选中Generate code only;

7、点击More settings,General-->Language选择C++;Interface选项中去掉所有选项;Close;

8、点击Build,进行编译;点击View report,弹出Code Generation Report对话框;

9、利用vs2008建立一个控制台应用程序,将生成的相关文件nrt.cpp、nrt.h、newtonSearchAlgorithm.cpp、newtonSearchAlgorithm.h、nrt_types.h、rtwtypes.h拷到相关目录下并添加到应用程序中;

10、分别在nrt.cpp、newtonSearchAlgorithm.cpp文件中添加#include “stdafx.h”;

11、test.cpp文件中代码为:

#include "stdafx.h"

#include "nrt.h"


#include


using namespace std;


int _tmain(int argc, _TCHAR* argv[])

{

double varargin_1 = 0, varargin_2 = 0, varargin_3 = 1e-9;


cin>>varargin_1>>varargin_2;


double nth_rt = 0, iterations = 0;


double hstry_data[50] = {0};


int hstry_sizes[1] = {0};


nrt(varargin_1, varargin_2, varargin_3, &nth_rt, &iterations, hstry_data, hstry_sizes);


cout<<"nth_rt = "<

cout<<"iterations = "<


cout<<"hstry_data = "<

for (int i=0; i<50; i++)

{

cout<

}


cout<<"hstry_sizes = "<


return 0;

}







阅读(10907) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~