Передайте функцию точки входа Выход как вход

Когда вы генерируете код для нескольких функций точки входа, необходимо задать входные типы для каждой функции. Используя 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 функция дает возможность создавать и выравнивать интерфейс для отдельных функций точки входа, которые принадлежат общей кодовой базе.

Смотрите также

| | | |

Похожие темы