Work Around Language Limitation: Code Generation Does Not Support Object Arrays
Issue
In certain situations, your MATLAB® algorithm uses an array of objects that are instances of the same class. But code generation does not support object arrays. When attempting to generate code for such MATLAB code, you get this or a similar error message:
Code generation does not support object arrays.
Possible Solutions
Use Cell Array of Objects
Code generation supports cell arrays of objects. In your MATLAB code, represent the collection of objects by using a cell array instead of an array.
For example, suppose that your MATLAB algorithm uses the class 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
The function addAreas
constructs and uses a
1
-by-3
array of
Square
objects:
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
Attempt to generate a MEX function for addAreas
. Code
generation fails because the local variable collection
is an
object array.
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
Redefine collection
to be a cell array instead. Modify the
code to use cell array indexing to index into collection
.
Name the modified function 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
Attempt to generate a MEX function for addAreas_new
. Code
generation succeeds and produces
addAreas_new_mex
.
codegen addAreas_new -args 0 -report
Code generation successful: View report
Verify that addAreas_new
and
addAreas_new_mex
have the same runtime behavior.
disp([addAreas_new(0) addAreas_new_mex(0)])
14 14
For Assignment with Nonscalar Indexing, Use Curly Braces and deal
Suppose that your original MATLAB code performs assignment to the array of objects by using
nonscalar indexing. For example, you might add this line after the first
for
loop in the addAreas
function:
collection(1:2) = [Square(10) Square(20)];
In the modified function addAreas_new
, index into the
corresponding cell array by using curly braces {}
and perform
assignment by using the deal
function. Replace the
above line by:
[collection{1:2}] = deal(Square(10),Square(20));