주요 콘텐츠

언어 제한 사항 해결: 코드 생성 시 객체 배열은 지원되지 않습니다

문제

특정 상황에서 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

함수 addAreasSquare 객체로 구성된 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));

참고 항목

도움말 항목