主要内容

coder.const

在生成的代码中将表达式折叠为常量

描述

例子

= coder.const (表达式评估表达式和替换在生成的代码中计算结果。

例子

着干活,…,outN= code .const(处理__arg1、…,argN计算具有句柄的多输出函数处理.然后替换掉着干活,…,outN在生成的代码中计算结果。

例子

全部折叠

此示例显示如何在生成的代码中使用指定常量coder.const

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

函数y = AddShift(Shift)% # codegeny = (1:10).^2+Shift;

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

codegen配置:自由-launchreportAddShiftarg游戏0

代码生成器生成用于创建向量的代码。它增加了转变在向量创建过程中,向量的每个元素。的定义AddShift在生成的代码中如下所示:

void AddShift(double Shift, double y[10]) {int k;对于(k = 0;K < 10;k + +) {y [k] = (double) ((1 + k) * (1 + k)) +转变;}}

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

codegen配置:自由-launchreportAddShiftarg游戏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;I < 10;i++) {y[i] = (double)iv[i] + Shift;}}

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

写一个函数getsine它有一个输入指数所引用的元素指数从正弦函数查找表中。这个函数getsine使用另一个函数创建查找表可以获得的

函数Y = getsin (index)% # codegen断言(isa(指数,“int32”));持续的(资源;如果Isempty (tbl) tbl = getttable (1024);结束Y = tbl(index);函数Y =可获取(n) Y = 0 (1,n);I = 1:n y(I) = sin((I -1)/(2*pi*n));结束

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

codegen配置:自由-launchreportgetsinearg游戏int32 (0)

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

替换语句:

TBL =可获取的(1024);

:

TBL = code .const(getttable (1024));

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

生成的代码包含查找表本身。coder.const强制表达式可以获得的(1024)在代码生成期间进行评估。生成的代码不包含计算的指令。生成的代码包含计算本身的结果。

类中的多输出函数在生成的代码中指定常量coder.const声明。

写一个函数MultiplyConst它有一个输入因素将两个向量的每个元素相乘vec1而且vec2因素.函数生成vec1而且vec2使用另一个函数EvalConsts

函数[y1,y2] = MultiplyConst(factor)% # 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配置:自由-launchreportMultiplyConstarg游戏0

代码生成器生成用于创建向量的代码。

替换语句

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

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

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

codegen配置:自由-launchreportMultiplyConstarg游戏0
代码生成器不生成用于创建向量的代码。相反,它计算向量并在生成的代码中指定计算的向量。

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

编写XML文件MyParams.xml包含下列语句:

   

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

编写MATLAB®函数xml2struct读取XML文件。该函数标识XML标记参数在另一个标签中参数个数

后确定参数时,函数为其属性赋值的名字到结构的字段名年代.该函数还为属性赋值价值到字段的值。

函数S = xml2struct(file) S = struct();Doc = xmlread(文件);els = doc.getElementsByTagName(“参数”);I = 0:els。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);s.(paramName) = paramValue;结束结束

保存xml2struct在当前文件夹中。

编写MATLAB函数MyFunc读取XML文件MyParams.xml变成一个结构年代使用函数xml2struct.声明xml2struct作为外在使用coder.extrinsic称之为acoder.const声明。

函数y = MyFunc(u)% # codegen断言(isa (u,“双”));coder.extrinsic (“xml2struct”);S = code .const(xml2struct(“MyParams.xml”));Y = s.hello + s.world + u;

MyFunc使用codegen命令。打开代码生成报告。

codegen配置:dll-launchreportMyFuncarg游戏0

代码生成器执行对xml2struct在代码生成期间。它替换了结构字段s.hello而且s.world在生成的代码中使用值17和42。

输入参数

全部折叠

MATLAB表达式或自定义单输出函数。

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

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

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

codegen配置:自由函数arg游戏coder.Constant (10)

例子:2 *π阶乘(10)

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

例子:@log@sin

数据类型:function_handle

带有句柄的函数的参数处理

参数必须是编译时常量。例如,下面的代码会导致代码生成错误,因为x而且y不是编译时常量。

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

若要修复错误,请执行赋值操作x而且y到MATLAB代码中的常数。或者,在代码生成期间,您可以使用编码器。常数定义输入类型如下:

codegen配置:自由函数arg游戏{coder.Constant (10), coder.Constant (2)}

输出参数

全部折叠

的价值表达式.在生成的代码中,MATLAB编码器™替换出现的价值是表达式

带有句柄的函数的输出处理MATLAB编码器求值函数并替换发生的着干活,…,outN使用生成的代码中的常量。

提示

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

  • 当常量折叠计算密集型函数调用时,为减少代码生成时间,使函数调用为外部调用。外部函数调用导致函数调用由MATLAB计算而不是由代码生成器计算。例如:

    函数j = fcn(z) zTable = code .const(0:0.01:100);jTable = code .const(feval(“besselj”3 zTable));j = interp1(zTable,jTable,z);结束

    看到使用编码器。const与外部函数调用(MATLAB编码器)

  • 如果coder.const无法对函数调用进行常量折叠,请尝试通过使函数调用为外部函数来强制进行常量折叠。外部函数调用导致函数调用由MATLAB计算而不是由代码生成器计算。例如:

    函数y = coder.const(feval(“兰德”, 1100));Yi = interp1(y,xi);结束

    看到使用编码器。const与外部函数调用(MATLAB编码器)

扩展功能

C/ c++代码生成
使用MATLAB®Coder™生成C和c++代码。

GPU代码生成
使用GPU Coder™为NVIDIA®GPU生成CUDA®代码。

版本历史

在R2013b中引入

另请参阅