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