主要内容

解决语言限制:代码生成不支持对象数组

问题

在某些情况下,您的 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_newaddAreas_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));

另请参阅

主题