为多个入口点函数生成代码时,必须为每个函数指定输入类型。使用编码器。OutputType
,可以将一个函数的输出类型作为输入类型传递给另一个函数。例如,使用函数的第二个输出的类型foo1
作为函数的输入类型foo2
,输入:
codegenfoo1arg游戏{7, 42}foo2arg游戏{coder.OutputType (' foo1 ', 2)}
你也可以使用编码器。OutputType
便于分区、组件化或扩展代码库的过程。例如,当你用MATLAB®代码使用或接受复杂的聚合数据类型时,考虑创建一个单独的构造函数来创建该数据类型。然后,生成多个入口点函数的代码,使用编码器。OutputType
将输出类型从构造函数传递给其他入口点函数。
有关使用多个入口点函数的详细信息,请参见为多个入口点函数生成代码.
的编码器。OutputType
函数提供了一种将使用相同数据类型的入口点函数链接在一起的方法。使用编码器。OutputType
:
简化输入类型规范过程。当现有入口点函数创建或定义数据类型时,可以将该定义重用为不同入口点函数的输入。
在入口点函数之间同步和对齐数据。当你使用编码器。OutputType
要传递数据类型,类型定义只有一个源,并且两个函数都使用该定义。
要理解这些优点,请比较使用和不使用生成代码的两种情况编码器。OutputType
.
假设您有一个复杂的数据类型,它对您的代码库很重要。有多个入口点函数依赖于此数据类型进行输入、输出和内部计算。您需要生成的函数代码之间的接口使用相同的类型定义。
在本例中,假设数据类型是一个嵌套结构,在最低级别的属性中存储了一个可变大小的数组。您需要命名此结构类型乱涂乱画
在生成的代码中。在MATLAB中,您为调用的数据类型编写构造函数myConstuctor
:
函数[out] = myConstructor(a, b)%创建一个上界为100 × 100的可变大小数组coder.varsize (“myStruct.f1.f2.f3.f4”, [100 100], [11 1]);定义嵌套结构类型myStruct = struct(“f1”结构(“f2”结构(‘f3’结构(“f4”,零(a,b)))));指定结构的名称及其字段之一coder.cstructname (myStruct.f1.f2.f3“squiggle_f3”);coder.cstructname (myStruct“蠕动”);out = myStruct;
写第二个函数,useConstructor
,这需要乱涂乱画
类型作为输入,执行加法,并将其他列推到数据的末尾。
函数x = useConstructor(x, n) xz = x.f1.f2. f2. f4;B = 0 (size(xz,1),1);为I = 1:n xz = [(xz + pi), b];结束x.f1.f2.f3。F4 = xz;
为以下内容生成代码myConstructor
而且useConstructor
并将它们视为多个入口点函数,您必须为这两个函数指定输入类型。指定的输入类型myConstructor
通过使用两个整数。为useConstructor
,将输入类型指定为的输出类型myConstructor
通过使用编码器。OutputType
:
V =编码器。OutputType (“myConstructor”);codegenmyConstructorarg游戏{5 1}useConstructorarg游戏{v, 3}报告配置:自由
在生成的代码中,函数接口是对齐的。的两个入口点函数使用相同的类型定义乱涂乱画
.可以使用为构造函数生成的代码为所生成的代码创建输入类型useConstructor
.
编码器。OutputType
如果你不使用编码器。OutputType
来定义的输入类型useConstructor
,则必须使用指定输入类型coder.typeof
而且编码器。StructType
类的属性:
% MATLAB类型定义的波形myStruct = struct(“f1”结构(“f2”结构(‘f3’结构(“f4”,零(2)))));t = code .typeof(myStruct);t.Fields.f1.Fields.f2.Fields.f3.Fields。F4 = code .typeof(0 (2), [100 100], [1 1]);t.Fields.f1.Fields.f2.Fields.f3。TypeName =“squiggle_f3”;t.TypeName =“蠕动”;
要生成静态库代码,输入:
codegenmyConstructorarg游戏{5 1}useConstructorarg游戏{t, 3}报告配置:自由
与第一个示例一样,函数接口是对齐的。的类型定义创建和维护乱涂乱画
是劳动密集型的。对类型定义所做的更改必须复制到两个地方:myConstructor
函数和当前工作空间变量t
.这些更改可能无法同步,特别是在处理复杂的类型定义时。使用编码器。OutputType
协助您的开发过程。
编码器。OutputType
以促进代码组件化如果MATLAB代码使用大型、复杂或聚合类型定义,则可以将代码分离为不同的入口点函数组件(例如构造函数和操作符)并使用编码器。OutputType
在它们之间传递类型定义。的编码器。OutputType
函数使您能够确保不同入口点函数之间有匹配的接口。
编码器。OutputType
传递输出类型考虑函数useSparse
它对稀疏矩阵输入执行操作。
函数out = useSparse(in)% # codegenOut = in*2;
如果您为useSparse
,您必须在C/ c++中手动构造适当的输入类型。为了自动化和简化类型构造,为稀疏矩阵编写一个构造函数。
函数A = makeSparse(i,j,v,m,n)% # codegenA =稀疏(i,j,v,m,n);
要生成代码,使用编码器。OutputType
将构造函数的输出作为输入传递给useSparse
.将输入参数定义为3 × 5矩阵。
T =编码器。OutputType(“makeSparse”);S = round(rand(3,5));[m,n] = size(S);[i,j,v] = find(S);I =编码器。typeof(i,[inf 1]);%允许非零条目的数量变化codegenmakeSparsearg游戏{我,我,我,m, n}useSparsearg游戏{t}报告
使用生成的C/ c++代码,可以调用makeSparse
来生成的输入useSparse
.的编码器。OutputType
函数可以轻松地为属于公共代码库的单独入口点函数创建和对齐接口。
coder.cstructname
|编码器。OutputType
|编码器。StructType
|coder.typeof
|coder.varsize