Работа вокруг ограничения языка: генерация кода не поддерживает Массивы объектов

Проблема

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

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте