Чтобы сгенерировать эффективный автономный код для MATLAB® классы должны использоваться по-другому, чем при запуске кода в среде MATLAB.
Что отличается | Дополнительная информация |
---|---|
Ограниченный набор языковых функций. | Языковые ограничения |
Ограниченный набор функций генерации кода. | Функции генерации кода, несовместимые с классами |
Определение свойств классов. | Определение свойств класса для генерации кода |
Использование классов handle. | Сгенерируйте код для классов Handle MATLAB и системных объектов Генерация кода для деструкторов классов Handle Ограничения, накладываемые на объекты указатель для генерации кода |
Глобальные переменные, содержащие указатель объектов MATLAB, не поддерживаются для генерации кода. | Н/Д |
Наследование от встроенных классов MATLAB не поддерживается. | Наследование от встроенных классов MATLAB не поддерживается |
Хотя поддержка генерации кода предусмотрена для общих функций классов, таких как свойства и методы, существует ряд расширенных функций, которые не поддерживаются, таких как:
События
Прослушиватели
Массивы объектов
Рекурсивные структуры данных
Связанные списки
Деревья
Графики
Вложенные функции в конструкторах
Перегрузочные операторы subsref
, subsassign
, и subsindex
В MATLAB классы могут определять свои собственные версии subsref
, subsassign
, и subsindex
методы. Генерация кода не поддерживает классы, которые имеют свои собственные определения этих методов.
The empty
метод
В MATLAB классы имеют встроенный статический метод, empty
, который создает пустой массив класса. Генерация кода не поддерживает этот метод.
Следующие классу Handle MATLAB методы:
addlistener
eq
findobj
findpro
The AbortSet
атрибут свойства
Можно сгенерировать код для функций MATLAB точки входа, которые используют классы, но вы не можете сгенерировать код непосредственно для класса MATLAB.
Для примера, если ClassNameA
является определением класса, вы не можете сгенерировать код путем выполнения:
codegen ClassNameA
Объект класса handle не может быть входным параметром функции или выходом точки входа.
Объект класса значения может быть входным параметром функции точки входа или выходом. Однако, если объект класса значения содержит объект класса handle, то объект класса значения не может быть входным параметром функции или выходом точки входа. Объект класса handle не может быть входным параметром функции или выходом точки входа.
Генерация кода не поддерживает глобальные переменные, которые являются классами handle.
Генерация кода не поддерживает назначение объекта класса значения свойству nontunable. Для примера, obj.prop=v;
недопустимо при prop
является свойством nontunable и v
является объектом, основанным на классе значений.
Вы не можете использовать coder.extrinsic
объявить класс или метод внешним.
Если объект имеет повторяющиеся имена свойства, и генератор кода пытается постоянно складывать объект, генерация кода может завершиться неуспешно. Генератор кода constant-складывает объект, когда он используется с coder.Constant
или, или когда это вход или вывод от постоянной свернутой внешней функции.
Повторяющиеся имена свойства происходят в объекте подкласса в следующих ситуациях:
Подкласс имеет свойство с таким же именем, что и свойство суперкласса.
Подкласс происходит из нескольких суперклассов, которые используют одно и то же имя для свойства.
Для получения информации о том, когда MATLAB разрешает повторяющиеся имена свойства, смотрите Подклассы нескольких классов.
Для генерации кода необходимо задать свойства класса по-другому, чем вы делаете при запуске своего кода в среде MATLAB:
Чтобы протестировать валидацию свойств, это лучшая практика, чтобы запустить MEX-функцию по полной области значений входа значений.
После определения свойства не присваивайте ему несовместимый тип. Не используйте свойство перед попыткой его роста.
Когда вы задаете свойства класса для генерации кода, учитывайте те же факторы, которые вы учитываете при определении переменных. В языке MATLAB переменные могут динамически изменять свой класс, размер или сложность во время исполнения, поэтому можно использовать ту же переменную, чтобы удерживать значение различного класса, размера или сложности. C и C++ используют статическое типирование. Перед использованием переменных, чтобы определить их тип, генератор кода требует полного назначения каждой переменной. Точно так же перед использованием свойств необходимо явным образом задать их класс, размер и сложность.
Начальные значения:
Если свойство не имеет явного начального значения, генератор кода принимает, что оно не определено в начале конструктора. Генератор кода не присваивает пустую матрицу как значение по умолчанию.
Если свойство не имеет начального значения, и генератор кода не может определить, что свойство назначено до первого использования, программное обеспечение генерирует ошибку компиляции.
Для системных объектов, если свойство nontunable является структурой, необходимо полностью назначить структуру. Вы не можете выполнить частичное назначение с помощью индексирования.
Для примера, для свойства nontunable, можно использовать следующее назначение:
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)
.
Свойства переменного размера:
Генерация кода поддерживает верхние и неограниченные свойства переменного размера для классов value и 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
является неограниченным свойством переменного размера. Если это известно, это свойство класса верхнего размера.
Если свойство class инициализировано массивом переменного размера, свойство имеет переменный размер.
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
и присвоенный свойству class 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