Когда вы генерируете код для нескольких функций точки входа, необходимо задать входные типы для каждой функции. Используя 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
class Properties:
% 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.StructType
| coder.typeof
| coder.varsize
| coder.cstructname
| coder.OutputType