exponenta event banner

Определение классов MATLAB для генерации кода

Для создания эффективного автономного кода для классов MATLAB ® необходимо использовать классы иначе, чем при выполнении кода в среде MATLAB.

Что отличаетсяДополнительные сведения
Ограниченный набор языковых функций.Языковые ограничения
Ограниченный набор функций генерации кода.Функции создания кода несовместимы с классами
Определение свойств класса.Определение свойств класса для создания кода
Использование классов дескрипторов.

Создание кода для классов дескрипторов MATLAB и системных объектов

Создание кода для деструкторов класса дескрипторов

Обработка ограничений объектов для создания кода

Глобальные переменные, содержащие объекты-дескрипторы MATLAB, не поддерживаются для создания кода.Н/Д
Наследование от встроенных классов MATLAB не поддерживается.Наследование из встроенных классов MATLAB не поддерживается

Языковые ограничения

Хотя поддержка генерации кода предоставляется для общих функций классов, таких как свойства и методы, существует ряд расширенных функций, которые не поддерживаются, таких как:

  • События

  • Слушатели

  • Массивы объектов

  • Рекурсивные структуры данных

    • Связанные списки

    • Деревья

    • Графики

  • Вложенные функции в конструкторах

  • Перегружаемые операторы subsref, subsassign, и subsindex

    В MATLAB классы могут определять собственные версии subsref, subsassign, и subsindex методы. Создание кода не поддерживает классы, имеющие собственные определения этих методов.

  • empty метод

    В MATLAB классы имеют встроенный статический метод, empty, что создает пустой массив класса. Создание кода не поддерживает этот метод.

  • Следующие методы класса дескрипторов MATLAB:

    • addlistener

    • eq

    • findobj

    • findpro

  • AbortSet атрибут свойства

Функции создания кода несовместимы с классами

  • Можно создать код для функций MATLAB точки входа, использующих классы, но нельзя создать код непосредственно для класса MATLAB.

    Например, если ClassNameA является определением класса, невозможно создать код путем выполнения:

    codegen ClassNameA

  • Объект класса дескриптора не может быть вводом или выводом функции точки входа.

  • Объект класса значений может быть вводом или выводом функции точки входа. Однако если объект класса значений содержит объект класса дескриптора, то объект класса значений не может быть вводом или выводом функции точки входа. Объект класса дескриптора не может быть вводом или выводом функции точки входа.

  • Создание кода не поддерживает глобальные переменные, которые являются классами обработки.

  • Создание кода не поддерживает назначение объекта класса значений неперестраиваемому свойству. Например, 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).

  • Свойства переменного размера:

    • Создание кода поддерживает свойства верхнего и неограниченного переменного размера для классов значений и дескрипторов.

    • Чтобы создать неограниченные свойства класса переменного размера, включите динамическое выделение памяти.

    • Чтобы создать свойство класса переменного размера, выполните два последовательных назначения свойства класса: одно - скаляру и следующее - массиву.

      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 не поддерживается

Невозможно создать код для классов, наследующих от встроенных классов MATLAB. Например, нельзя создать код для следующего класса:

classdef myclass < double