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

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

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

| | | |

Похожие темы