主要内容

coder.const

折入表达式中的常数生成的代码

描述

例子

= coder.const (表达评估表达并取代在生成的代码中计算结果。

例子

[着干活,…,outN) = coder.const (处理ARG1,...,ARGN计算具有句柄的多输出函数处理.然后替换着干活,…,outN与评价在所生成的代码的结果。

例子

全部折叠

这个例子展示了如何使用coder.const

写一个函数AddShift它需要一个输入转移并把它加到向量的元素上。这个向量由前10个自然数的平方组成。AddShift生成这个向量。

函数y = AddShift(转变)%#codegen.Y =(1:10)^ 2 + Shift键;

生成代码AddShift使用Codegen.命令。打开代码生成报告。

Codegen.配置:自由-launchreportAddShift-  args.0.

代码生成器生成用于创建向量的代码。它增加了转移到向量创建期间的矢量的每个元素。定义AddShift在生成的代码如下所示:

空隙AddShift(双转移,双Y [10]){INT K表;为(K = 0; k <10; k ++){Y [K] =(双)((1 + K)*(1 + k))的+ Shift键;}}

替换表达式(1:10)。^ 2coder.const((1:10) ^ 2)。,然后生成的代码AddShift再次使用Codegen.命令。打开代码生成报告。

Codegen.配置:自由-launchreportAddShift-  args.0.

代码生成器创建包含第一10张自然数的平方的矢量。在生成的代码,它增加了转移这个向量的每个元素。定义AddShift在生成的代码如下所示:

void AddShift(double Shift, double y[10]) {int i;Static const signed char iv[10] = {1, 4, 9, 16, 25, 36, 49, 64, 81, 100};For (i = 0;我< 10;i++) {y[i] = (double)iv[i] + Shift;}}

这个示例展示了如何将用户编写的函数折叠到生成的代码中的常量中。

写一个函数getsine它需要一个输入指数返回引用的元素指数从正弦函数的查找表中。这个函数getsine使用另一个函数创建查找表gettable.

函数y = getsine(指数)%#codegen.断言(ISA(指数,'int32'));执着的TBL;如果Isempty (tbl) tbl = gettable(1024);结尾Y = TBL(索引);函数Y = gettable(N)Y =零(1,N);为了I = 1:n的Y(I)= SIN(第(i-1)/(2 * PI * N));结尾

生成代码getsine使用类型的参数int32.打开代码生成报告。

Codegen.配置:自由-launchreportgetsine-  args.int32 (0)

生成的代码包含创建查找表的指令。

取代声明:

台=可以获得的(1024);

和:

TBL = coder.const(gettable(1024));

生成代码getsine使用类型的参数int32.打开代码生成报告。

生成的代码包含查找表本身。coder.const强制表达gettable(1024)代码生成过程中进行评价。所生成的代码不包含评估说明。生成的代码包含评估本身的结果。

控件中的多输出函数显示如何在生成的代码中指定常量coder.const声明。

写一个函数MultiplyConst它需要一个输入因素然后乘以两个向量的每个元素vec1vec2因素.该函数生成vec1vec2使用另一个函数EvalConsts

函数(y1, y2) = MultiplyConst(因素)%#codegen.[vec1, vec2] = EvalConsts(π。*(1. / 2。^ (1:10)),2);日元= vec1。*因素;y2 = vec2。*因素;函数(f1、f2) = EvalConsts (z, n) f1 = z。^ (2 * n) /阶乘(2 * n);f2 = z。^ (2 * n + 1) /阶乘(2 * n + 1);

生成代码MultiplyConst使用Codegen.命令。打开代码生成报告。

Codegen.配置:自由-launchreportMultiplyConst-  args.0.

代码生成器用于创建矢量产生代码。

更换声明

[vec1, vec2] = EvalConsts(π。*(1. / 2。^ (1:10)),2);

[vec1, vec2] = coder.const (@EvalConsts,π。*(1. / 2。^ (1:10)),2);

生成代码MultiplyConst使用Codegen.命令。打开代码生成报告。

Codegen.配置:自由-launchreportMultiplyConst-  args.0.
代码生成器不会为创建载体生成代码。取而代之的是,它计算矢量并指定在生成的代码所计算的矢量。

这个例子展示了如何调用一个外部函数coder.const

写一个XML文件MyParams.xml包含下列声明:

    . value="42"/>  . value="17"/>

保存MyParams.xml在当前文件夹。

写一个MATLAB®函数XML2STRUCT.读取XML文件。该功能对XML标签帕纳在另一个标签参数个数

后确定帕纳中,功能分配其属性的值姓名转换为结构的字段名S..函数还指定attribute的值价值到该字段的值。

函数S = xml2struct(file); / /文件医生= xmlread(文件);els = doc.getElementsByTagName (“参数”);为了我= 0:隧道。getLength-1 it = els.item(i);ps = it.getElementsByTagName (“参数”);为了J = 0:ps.getLength-1 PARAM = ps.item(J);PARAMNAME = CHAR(param.getAttribute(“名字”));paramValue = CHAR(param.getAttribute('价值'));paramValue = evalin(“基地”, paramValue);年代。(paramName) = paramValue;结尾结尾

保存XML2STRUCT.在当前文件夹。

编写MATLAB函数MYFUNC读取XML文件MyParams.xml成一个结构S.使用函数XML2STRUCT..宣布XML2STRUCT.外部使用编码器.Extrinsic.把它叫做coder.const声明。

函数Y = MYFUNC(u)的%#codegen.断言(ISA(U,“双”));coder.extrinsic('xml2struct');s = coder.const (xml2struct ('MyParams.xml'));Y = s.hello + s.world + u;

生成代码MYFUNC使用Codegen.命令。打开代码生成报告。

Codegen.配置:dll-launchreportMYFUNC-  args.0.

代码生成执行调用XML2STRUCT.在代码生成。它替换了结构字段s.hellos.world在生成的代码中使用值17和42。

输入参数

全部折叠

MATLAB表达式或用户定义的单输出函数。

表达式必须只有编译时常量。函数必须只接受常量参数。例如,下面的代码将导致代码生成错误,因为X不是编译时常量。

函数y = func (x) y = coder.const (log10 (x));

要修复错误,请赋值X为MATLAB代码中的常数。或者,在代码生成期间,您可以使用编码器。常数定义输入类型如下:

Codegen.配置:自由fun-  args.coder.Constant(10)

例子:2 *π阶乘(10)

手柄内置的或用户编写的函数。

例子:@log@罪

数据类型:function_handle.

带句柄的函数的参数处理

参数必须是编译时间常数。例如,下面的代码将导致代码生成错误,因为Xy不是编译时常量。

函数y = func (x, y) y = coder.const (@nchoosek, x, y);

要修复错误,请赋值Xy到MATLAB代码中的常量。或者,在代码生成期间,您可以使用编码器。常数定义输入类型如下:

Codegen.配置:自由fun-  args.{coder.Constant(10),coder.Constant(2)}

输出参数

全部折叠

的价值表达.在生成的代码中,Matlab Coder™替代的出现与价值表达

带手柄的功能输出处理Matlab编码器评估的功能,并替换事件着干活,…,outN用在生成的代码的常数。

提示

  • 如果可能的话,代码生成器会自动地对表达式进行常量折叠。通常,只对带有标量的表达式进行自动常量折叠。使用coder.const当代码生成器不能自己对表达式进行常量折叠时。

  • 当恒折计算密集型的函数调用,减少代码生成时间,使函数调用外在的。外在函数调用由MATLAB,而不是由代码生成会导致函数调用的评估。例如:

    函数j = fcn(z) zTable = code .const(0:01:100);jTable = coder.const(函数宏指令(“besselj”,3,zTable));J = interp1(zTable,JTable中,Z);结尾

    使用编码器。const与外部函数调用

  • 如果coder.const无法恒定倍一个函数调用,尝试通过使函数调用外在强制恒定折叠。外在函数调用由MATLAB,而不是由代码生成会导致函数调用的评估。例如:

    函数YI = FCN(XI)Y = coder.const(feval(“兰德”,1100));YI = interp1(Y,XI);结尾

    使用编码器。const与外部函数调用

介绍了R2013b