Когда вы генерируете код для нескольких функций точки входа, необходимо задать входные типы для каждой функции. Используя coder.OutputType
, можно передать выходной тип одной функции как входной тип к другой функции. Например, чтобы использовать тип второго вывода от функционального foo1
как входной тип к функциональному foo2
, введите:
codegen foo1 -args {7, 42} foo2 -args {coder.OutputType('foo1',2)}
Можно также использовать coder.OutputType
, чтобы упростить процесс разделения, разбиения на компоненты или расширения кодовой базы. Например, когда ваш код MATLAB® использует или принимает сложный тип агрегированных данных, рассмотрите создание отдельной функции конструктора, которая создает тот тип данных. Затем сгенерируйте код для нескольких функций точки входа, с помощью coder.OutputType
, чтобы передать выходной тип от конструктора к другим функциям точки входа.
Для получения дополнительной информации об использовании нескольких функций точки входа смотрите, Генерируют Код для Нескольких Функций Точки входа.
Функция 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
, чтобы передать определение типа между ними. Функция 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
. Функция coder.OutputType
дает возможность создавать и выравнивать интерфейс для отдельных функций точки входа, которые принадлежат общей кодовой базе.
coder.OutputType
| coder.StructType
| coder.cstructname
| coder.typeof
| coder.varsize