主要内容

传递一个入口点函数输出作为输入

为多个入口点函数生成代码时,必须为每个函数指定输入类型。使用编码器。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函数可以轻松地为属于公共代码库的单独入口点函数创建和对齐接口。

另请参阅

||||

相关的话题