解决语言限制:代码生成不支持对象数组
问题
在某些情况下,您的 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 构造并使用一个由 Square 对象组成的 1×3 数组:
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
尝试为 addAreas 生成一个 MEX 函数。代码生成失败,因为局部变量 collection 是对象数组。
codegen addAreas -args 0 -report
Code generation does not support object arrays.(代码生成不支持对象数组。)
改为将 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
尝试为 addAreas_new 生成一个 MEX 函数。代码生成成功并生成 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 代码使用非标量索引对对象数组执行赋值。例如,您可以在 addAreas 函数中的第一个 for 循环后添加以下行:
collection(1:2) = [Square(10) Square(20)];
在修改后的函数 addAreas_new 中,使用花括号 {} 对对应的元胞数组进行索引,并使用 deal 函数执行赋值。将上面的代码行替换为:
[collection{1:2}] = deal(Square(10),Square(20));