权利声明:本文系雷声天下个人学习所用,将Mathworks公司高级工程师Loren的日志翻译成中文,与大家分享。喜欢Matlab的同学可以好好学习一下。不可以被用作商业利用啊,违者必究!!!
本文的问题:Matlab Coder的基本使用
Matlab的C语言自动生成(一)
Matlab 2 C语言简史:
2011年4月Mathworks公司将Matlab的M2C语言生成功能作为一个独立的产品推出,这个功能是的我们可以从Matlab算法生成可读的、端口模块化的、订制的C代码。其实Matlab 的老用户们不觉得这是什么新鲜的功能,下面我们给出这个功能的日程表
2004 在Simulink中添加了Embeded Matlab Function 模块
2007 在Real-Time Workshop中添加了emlc函数,现在称其为Simulink Coder用于生成独立的C代码
2011 发布了Matlab Coder,第一个独立的产品,用于从Matlab代码中生成独立的、可读的、模块化的C代码
代码生成样例:
下面给出一个简单的代码生成样例:
我们手中有这样一个函数文件名称为simpleProduct.m
1    function c = simpleProduct(a,b) %#codegen
2    c = a*b;
为了将这个函数生成C文件,需要提前将文件中的输入、输出参数的维数进行指定,这时候可以以实用Matlab提供的Matlab Coder UI辅助设计如图表1所示:
图表1 启动Matlab Coder UI
并且按照引导生成新的功能,首先如图表2和图表3所示建立新的工程
图表2 建立工程
图表3 添加要生成的文件并且选择类型
导入文件成功后采用功能,对其中的参数定标,确定数据的类型和维数
图表4 确定参数的类型和维数
图表5 参数修改结果
点击Build界面开始生成代码
图表6 生成代码
图表7代码生成成功
代码生成成功后就可以,查看代码并且可以查看相应的报告
matlab难还是c语言难
图表8 相应的报告
在报告当中可以看到有哪些函数的生成了
同样的还可以采用这个工具包生成MEX文件
让我们开始回顾这个过程:
1 首先我们开始准备文件有可能Matlab的某些函数不在支持转化范围,需要你重新调整算法才是
2 验证和测试,请你生成一个MEX函数文件来测试是否你生成的M函数是正确的。当然具体的过程就是你要把Mex函数替代原有的M函数,然后测试生结果,不行的话就返回头去修改你的M代码吧
3 生成:别的不说了生成吧
下面是原日志中一个成熟的例子
1    function [x,h] = newtonSearchAlgorithm(b,n,tol) %#codegen
2    % Given, "a", this function finds the nth root of a
3    % number by finding where: x^n-a=0.
4
5        notDone = 1;
6        aNew    = 0; %Refined Guess Initialization
7        a      = 1; %Initial Guess
8        count    = 0;
9        h(1)=a;
10        while notDone
11            count = count+1;
12            [curVal,slope] = fcnDerivative(a,b,n); %square
13            yint = curVal-slope*a;
14            aNew = -yint/slope; %The new guess
15            h(count)=aNew;
16            if (abs(aNew-a) < tol) %Break if it's converged
17                notDone = 0;
18            elseif count>49 %after 50 iterations, stop
19                notDone = 0;
20                aNew = 0;
21            else
22                a = aNew;
23            end
24        end
25        x = aNew;
26
27    function [f,df] = fcnDerivative(a,b,n)
28    % Our function is f=a^n-b and it's derivative is n*a^(n-1).
29
30        f  = a^n-b;
31        df = n*a^(n-1);
Our first step towards generating C code from this file is to prepare it for code generation. For code generation, each variable inside your MATLAB code must be intialized, which means specifying its size and data type. In this case, I'll choose to initialize the variable h to a static maximum size, h = zeros(1,50), as it doesn't grow beyond a length of 50 inside the for loop.
You can invoke the code generation function using the GUI or the command line (through the codegen command). Without worrying about the details of this approach, let's look at the generated C code:
1    #include "newtonSearchAlgorithmMLC.h"
2
3    void newtonSearchAlgorithmMLC(real_T b, real_T n, real_T tol, real_T *x, real_T
4      h[50])
5    {

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。