Чтобы сгенерировать эффективный автономный код для классов MATLAB®, необходимо использовать классы по-другому, запуская код в среде MATLAB.
Что отличается | Больше информации |
---|---|
Ограниченный набор функций языка. | Ограничения языка |
Ограниченный набор функций генерации кода. | Генерация кода показывает не совместимый с классами |
Определение свойств класса. | Определение свойств класса для генерации кода |
Использование классов Handle. | Сгенерируйте код для MATLAB Классы Handle и системные объекты |
Глобальные переменные, содержащие объекты указателя MATLAB, не поддерживаются для генерации кода. | Нет данных |
Наследование от встроенных классов MATLAB не поддерживается. | Наследование от встроенных классов MATLAB, не поддержанных |
Несмотря на то, что поддержка генерации кода оказывается для типичных функций классов, таких как свойства и методы, существует много расширенных функций, которые не поддерживаются, такие как:
События
Прослушиватели
Массивы объектов
Рекурсивные структуры данных
Связанные списки
Деревья
Графики
Вложенные функции в конструкторах
Сверхзагружаемые операторы subsref
, subsassign
, и subsindex
В MATLAB классы могут задать свои собственные версии subsref
, subsassign
, и subsindex
методы. Генерация кода не поддерживает классы, которые имеют их собственные определения этих методов.
empty
метод
В MATLAB классы имеют встроенный статический метод, empty
, который создает пустой массив класса. Генерация кода не поддерживает этот метод.
Следующие методы класса Handle MATLAB:
addlistener
eq
findobj
findpro
AbortSet
атрибут свойства
Можно сгенерировать код для функций MATLAB точки входа, которые используют классы, но вы не можете сгенерировать код непосредственно для класса MATLAB.
Например, если ClassNameA
определение класса, вы не можете сгенерировать код путем выполнения:
codegen ClassNameA
Объект класса Handle не может быть входным параметром функции точки входа или вывести.
Объект класса значения может быть входным параметром функции точки входа или вывести. Однако, если объект класса значения содержит объект класса Handle, то объект класса значения не может быть входным параметром функции точки входа или вывести. Объект класса Handle не может быть входным параметром функции точки входа или вывести.
Генерация кода не поддерживает глобальные переменные, которые являются классами Handle.
Генерация кода не поддерживает присвоение объекта класса значения в ненастраиваемое свойство. Например, obj.prop=v;
недопустимо когда prop
ненастраиваемое свойство и v
основанное на объектах на классе значения.
Вы не можете использовать coder.extrinsic
объявить класс или метод как значение внешних параметров.
Если объект имеет дублирующиеся имена свойства, и генератор кода пробует к постоянному сгибу объект, генерация кода может перестать работать. Постоянные сгибы генератора кода объект, когда это используется с coder.Constant
или, или когда это - вход к или выведенный от постоянно свернутой внешней функции.
Дублирующиеся имена свойства происходят в объекте подкласса в этих ситуациях:
Подкласс имеет свойство с тем же именем как свойство суперкласса.
Подкласс выводит из нескольких суперклассов, которые используют то же имя для свойства.
Для получения информации о том, когда MATLAB позволяет дублирующиеся имена свойства, смотрите Разделение на подклассы Нескольких Классов.
Для генерации кода необходимо задать свойства класса по-другому, чем вы делаете при выполнении кода в среде MATLAB:
Чтобы протестировать валидацию свойства, это - лучшая практика запустить MEX-функцию по полному спектру входных значений.
После определения свойства не присваивайте его несовместимый тип. Не используйте свойство прежде, чем попытаться вырастить его.
Когда вы задаете свойства класса для генерации кода, рассматриваете те же факторы, которые вы учитываете при определении переменных. На языке MATLAB переменные могут изменить свой класс, размер или сложность динамически во время выполнения, таким образом, можно использовать ту же переменную, чтобы содержать значение различного класса, размера или сложности. C и C++ используют статический контроль типов. Перед использованием переменных, чтобы определить их тип, генератор кода требует полного присвоения на каждую переменную. Точно так же перед использованием свойств, необходимо явным образом задать их класс, размер и сложность.
Начальные значения:
Если свойство не имеет явного начального значения, генератор кода принимает, что это не определено в начале конструктора. Генератор кода не присваивает пустую матрицу как значение по умолчанию.
Если свойство не имеет начального значения, и генератор кода не может решить, что свойство присвоено до первого использования, программное обеспечение генерирует ошибку компиляции.
Для Системных объектов, если ненастраиваемое свойство является структурой, необходимо полностью присвоить структуру. Вы не можете сделать частичного индексирования использования присвоения.
Например, для ненастраиваемого свойства, можно использовать следующее присвоение:
mySystemObject.nonTunableProperty=struct('fieldA','a','fieldB','b');
Вы не можете использовать следующие частичные присвоения:
mySystemObject.nonTunableProperty.fieldA = 'a'; mySystemObject.nonTunableProperty.fieldB = 'b';
coder.varsize
не поддерживается для свойств класса.
Если начальное значение свойства является объектом, то свойство должно быть постоянным. Чтобы сделать свойство постоянным, объявите Constant
припишите в блоке свойства. Например:
classdef MyClass properties (Constant) p1 = MyClass2; end end
MATLAB вычисляет начальные значения класса во время загрузки класса перед генерацией кода. Если вы используете персистентные переменные в инициализации свойства класса MATLAB, значении персистентной переменной, вычисленной, когда загрузки класса принадлежат MATLAB; это не значение, используемое во время генерации кода. Если вы используете coder.target
в инициализации свойства класса MATLAB, coder.target('MATLAB')
возвращает true (1)
.
Свойства переменного размера:
Генерация кода поддерживает верхне ограниченные и неограниченные свойства переменного размера и для значения и для классов Handle.
Чтобы сгенерировать неограниченные свойства класса переменного размера, включите динамическое выделение памяти.
Чтобы сделать свойство класса переменного размера, сделайте два последовательных присвоения свойства класса, одного к скаляру и рядом с массивом.
classdef varSizeProp1 < handle properties prop varProp end end
function extFunc(n) obj = varSizeProp1; % Assign a scalar value to the property. obj.prop = 1; obj.varProp = 1; % Assign an array to the same property to make it variable-sized. obj.prop = 1:98; obj.varProp = 1:n; end
В предыдущем коде, первом присвоении на prop
и varProp
скаляр, и их второе присвоение к массиву с тем же базовым типом. Размер prop
имеет верхнюю границу 98
, делая его верхне ограниченным, свойством переменного размера.
Если n
неизвестно во время компиляции, obj.varProp
неограниченное свойство переменного размера. Если это известно, это - верхне ограниченный, свойство класса переменного размера.
Если свойство класса инициализируется массивом переменного размера, свойство является переменным размером.
classdef varSizeProp2 properties prop end methods function obj = varSizeProp2(inVar) % Assign incoming value to local variable locVar = inVar; % Declare the local variable to be a variable-sized column % vector with no size limit coder.varsize('locVar',[inf 1],[1 0]); % Assign value obj.prop = locVar; end end end
В предыдущем коде, inVar
передается конструктору класса и хранится в locVar
. locVar
изменяется, чтобы быть переменным размером coder.varsize
и присвоенный свойству obj.prop
класса, который делает переменный размер свойства.
Если вход к вызову функции varSizeProp2
переменный размер, coder.varsize
не требуется.
function z = constructCall(n) z = varSizeProp2(1:n); end
Если значение n
неизвестно во время компиляции и не имеет никаких заданных границ, z.prop
неограниченное свойство класса переменного размера.
Если значение n
неизвестно во время компиляции и задал границы, z.prop
верхне ограниченное свойство класса переменного размера.
Если свойство является постоянным, и его значение является объектом, вы не можете изменить значение свойства того объекта. Например, предположите что:
obj
объект myClass1
.
myClass1
имеет постоянное свойство p1
это - объект myClass2
.
myClass2
имеет свойство p2
.
Генерация кода не поддерживает следующий код:
obj.p1.p2 = 1;
Вы не можете сгенерировать код для классов, которые наследовались встроенным классам MATLAB. Например, вы не можете сгенерировать код для следующего класса:
classdef myclass < double