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

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

См. также

| | | |

Похожие темы