exponenta event banner

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

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

См. также

| | | |

Связанные темы