언어 제한 사항 해결: 코드 생성 시 객체 배열은 지원되지 않습니다
문제
특정 상황에서 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));