В определенных ситуациях, вашем 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));