В определенных ситуациях, вашем MATLAB® алгоритм использует массив объектов, которые являются экземплярами того же класса. Но генерация кода не поддерживает массивы объектов. При попытке сгенерировать код для такого кода MATLAB, вы получаете это или подобное сообщение об ошибке:
Code generation does not support object arrays.
Генерация кода поддерживает массивы ячеек объектов. В вашем коде MATLAB представляйте набор объектов при помощи массива ячеек вместо массива.
Например, предположите, что ваш алгоритм MATLAB использует класс Square:
classdef Square properties(Access = private) side end methods(Access = public) function obj = Square(side) obj.side = side; end function area = calculateArea(obj) area = obj.side^2; end end end
Функциональный addAreas построения и использование 1- 3 массив Square объекты:
function y = addAreas(n) obj = Square(0); collection = [obj obj obj]; % collection is an array for i = 1:numel(collection) collection(i) = Square(n + i); end y = 0; for i = 1:numel(collection) y = y + collection(i).calculateArea; end end
Попытайтесь сгенерировать MEX-функцию для addAreas. Генерация кода перестала работать потому что локальная переменная collection объектный массив.
codegen addAreas -args 0 -report
??? Code generation does not support object arrays. Error in ==> addAreas Line: 3 Column: 14 Code generation failed: View Error Report
Переопределите collection быть массивом ячеек вместо этого. Измените код, чтобы использовать индексацию массива ячеек, чтобы индексировать в collection. Назовите модифицированный функциональный addAreas_new.
function y = addAreas_new(n) obj = Square(0); collection = {obj obj obj}; % collection is a cell array for i = 1:numel(collection) collection{i} = Square(n + i); end y = 0; for i = 1:numel(collection) y = y + collection{i}.calculateArea; end end
Попытайтесь сгенерировать MEX-функцию для addAreas_new. Генерация кода следует и производит addAreas_new_mex.
codegen addAreas_new -args 0 -report
Code generation successful: View report
Проверьте тот addAreas_new и addAreas_new_mex имейте то же поведение во время выполнения.
disp([addAreas_new(0) addAreas_new_mex(0)])
14 14
dealПредположим, что ваш оригинальный код MATLAB выполняет присвоение на массив объектов при помощи нескалярной индексации. Например, вы можете добавить эту линию после первого for цикл в addAreas функция:
collection(1:2) = [Square(10) Square(20)];
В модифицированном функциональном addAreas_new, индексируйте в соответствующий массив ячеек при помощи фигурных скобок {} и выполните присвоение при помощи deal функция. Замените вышеупомянутую линию:
[collection{1:2}] = deal(Square(10),Square(20));