Когда вы генерируете код для нескольких функций точки входа, необходимо задать входные типы для каждой функции. Использование coder.OutputType
можно передать выходу тип одной функции как тип входа другой функции. Например, чтобы использовать тип второго выхода функции foo1
как тип входа в функцию foo2
, введите:
codegen foo1 -args {7, 42} foo2 -args {coder.OutputType('foo1',2)}
Можно также использовать coder.OutputType
для облегчения процесса разбиения, компонентизации или расширения вашей основы кода. Для примера, когда ваш MATLAB® код использует или принимает сложный, агрегированный тип данных, рассмотрите создание отдельной функции конструктора, которая создает этот тип данных. Затем сгенерируйте код для нескольких функций точки входа, используя coder.OutputType
для передачи выхода из конструктора в другие функции точки входа.
Для получения дополнительной информации об использовании нескольких функций точки входа, смотрите Сгенерировать код для нескольких функций точки входа.
The coder.OutputType
функция предоставляет способ объединения функций точки входа, которые используют одни и совпадающие типы данных. Использование coder.OutputType
кому:
Упростите процесс спецификации входного типа. Когда существующая функция точки входа создает или задает тип данных, можно повторно использовать это определение для входа в другую функцию точки входа.
Синхронизация и выравнивание данных между функциями точки входа. Когда вы используете coder.OutputType
для прохождения типа данных существует только один источник для определения типа, и это определение используется обеими функциями.
Чтобы понять эти преимущества, сравните два случая, когда вы генерируете код с использованием и без него coder.OutputType
.
Предположим, что у вас есть сложный тип данных, который важен для вашей основы кода. У вас есть несколько функций точки входа, которые полагаются на этот тип данных для ввода, вывода и внутренних расчетов. Вы требуете интерфейсов между сгенерированным кодом функции, чтобы использовать то же определение типа.
В целях этого примера предположим, что тип данных является вложенной структурой с массивом переменного размера, хранящимся в свойстве самого низкого уровня. Вы хотите назвать этот тип структуры squiggle
в сгенерированном коде. В MATLAB вы записываете функцию построения для типа данных myConstuctor
:
function [out] = myConstructor(a, b) % create a variable-sized array with upper bounds of 100-by-100 coder.varsize('myStruct.f1.f2.f3.f4', [100 100], [1 1]); % define the nested structure type myStruct = struct('f1', struct('f2', struct('f3', struct('f4', zeros(a,b) )))); % specify the name of the structure and one of its fields coder.cstructname(myStruct.f1.f2.f3,'squiggle_f3'); coder.cstructname(myStruct,'squiggle'); out = myStruct;
Вы пишете вторую функцию, useConstructor
, который принимает squiggle
введите в качестве входных данных, выполняет сложение и толкает дополнительные столбцы в конец данных.
function x = useConstructor(x, n) xz = x.f1.f2.f3.f4; b = zeros(size(xz,1),1); for i = 1:n xz = [(xz + pi), b]; end x.f1.f2.f3.f4 = xz;
Чтобы сгенерировать код для myConstructor
и useConstructor
и обрабатывать их как несколько функций точки входа, необходимо задать входные типы для обеих функций. Задайте входные типы для myConstructor
при помощи двух целых чисел. Для useConstructor
, укажите тип входа в качестве типа выходного сигнала из myConstructor
при помощи coder.OutputType
:
v = coder.OutputType('myConstructor'); codegen myConstructor -args {5,1} useConstructor -args {v,3} -report -config:lib
В сгенерированном коде функциональные интерфейсы выровнены. Две функции точки входа используют одно и то же определение типа для squiggle
. Можно использовать сгенерированный код для конструктора, чтобы создать тип входа для сгенерированного кода для useConstructor
.
coder.OutputType
Если вы не используете coder.OutputType
для определения типа входа для useConstructor
, необходимо задать тип входа при помощи coder.typeof
и coder.StructType
свойства класса:
% MATLAB type definition for squiggle myStruct = struct('f1', struct('f2', struct('f3', struct('f4', zeros(2) )))); t = coder.typeof(myStruct); t.Fields.f1.Fields.f2.Fields.f3.Fields.f4 = coder.typeof(zeros(2), [100 100], [1 1]); t.Fields.f1.Fields.f2.Fields.f3.TypeName = 'squiggle_f3'; t.TypeName = 'squiggle';
Для генерации кода статической библиотеки введите:
codegen myConstructor -args {5,1} useConstructor -args {t,3} -report -config:lib
Как и в первом примере, интерфейсы функций выровнены. Однако создание и ведение определения типа для squiggle
является трудоемким. Изменения, которые вы вносите в определение типа, должны быть реплицированы в двух местах: myConstructor
функцию и текущую переменную рабочей области t
. Эти изменения могут выйти из синхронизации, особенно при работе с сложными определениями типов. Использование coder.OutputType
помочь в процессе разработки.
coder.OutputType
для облегчения компонентации кодаЕсли ваш код MATLAB использует большие, сложные или агрегированные определения типов, можно разделить код на различные компоненты функции точки входа (такие как конструктор и оператор) и использовать coder.OutputType
для прохождения определения типа между ними. The coder.OutputType
функция позволяет вам гарантировать соответствие интерфейса между различными функциями точки входа.
coder.OutputType
для прохождения выходаРассмотрим функцию useSparse
который выполняет операцию на входе разреженной матрицы.
function out = useSparse(in) %#codegen out = in*2;
Если вы генерируете код для useSparse
необходимо вручную создать соответствующий входной тип на C/C + +. Чтобы автоматизировать и упростить конструкцию типов, запишите конструктор для разреженной матрицы.
function A = makeSparse(i,j,v,m,n) %#codegen A = sparse(i,j,v,m,n);
Чтобы сгенерировать код, используйте coder.OutputType
чтобы передать выход из конструктора как вход в useSparse
. Задайте свой входной параметр как матрицу 3 на 5.
t = coder.OutputType('makeSparse'); S = round(rand(3,5)); [m,n] = size(S); [i,j,v] = find(S); i = coder.typeof(i,[inf 1]); % allow number of nonzero entries to vary codegen makeSparse -args {i,i,i,m,n} useSparse -args {t} -report
Используя сгенерированный код C/C + +, можно вызвать makeSparse
чтобы сгенерировать вход в useSparse
. The coder.OutputType
функция облегчает создание и выравнивание интерфейса для отдельных функций точки входа, которые относятся к общей основе кода.
coder.cstructname
| coder.OutputType
| coder.StructType
| coder.typeof
| coder.varsize