System object 정의를 위한 팁
System object™는 반복적인 처리에 최적화된, 특수한 MATLAB® 객체입니다. 객체를 여러 번 실행하거나 루프에서 데이터를 처리해야 하는 경우 System object를 사용합니다. 사용자가 직접 System object를 정의할 때 다음 제안 사항을 참조하면 System object를 더욱 빠르게 실행할 수 있습니다.
일반
setupImpl
메서드에 모든 일회성 계산을 정의하고 그 결과를 프라이빗 속성에 캐시합니다. 반복된 계산에는stepImpl
메서드를 사용하십시오.1
또는0
대신에 각각true
또는false
를 사용하여 부울 값을 지정하십시오.호출 간에 메서드에 있는 변수의 값을 유지할 필요가 없는 경우, 해당 메서드에 있는 변수에 대해 로컬 범위를 사용하십시오.
입력값과 출력값
일부 메서드는
setupImpl
,updateImpl
,validateInputsImpl
,isInputDirectFeedThroughImpl
,processInputSpecificationChangeImpl
같은stepImpl
알고리즘의 입력값을 자신의 입력값으로 사용합니다. 입력값은stepImpl
에 대한 입력값과 순서가 일치해야 하지만 입력값 개수가 일치할 필요는 없습니다. 사용자가 하려는 구현에 System object에 대한 입력값이 필요하지 않은 경우 입력값을 모두 제외할 수 있습니다.getNumInputsImpl
메서드와getNumOutputsImpl
메서드에 대해, 객체 속성에서 반환 인수를 설정한 경우 해당 객체 속성에Nontunable
특성(Attribute)이 있어야 합니다.
메서드 정의에 ~를 입력 인수로 사용하기
정적 메서드를 제외한 모든 메서드의 첫 번째 입력 인수는 System object 핸들이어야 합니다. System object 핸들의 이름은 자유롭게 지정할 수 있습니다. MATLAB 편집기 메뉴에 의해 삽입된 코드는 obj
를 사용합니다.
대부분의 예제에서, 함수에 객체 핸들이 사용되지 않음을 나타내기 위해 객체 핸들을 전달하는 대신 ~
가 사용됩니다. 객체 핸들 대신 ~를 사용하면 사용되지 않은 변수에 대한 경고가 발생하지 않습니다.
속성
변경되지 않는 속성은
Nontunable
속성으로 정의하십시오.Tunable
속성은Nontunable
속성보다 액세스 속도가 느립니다.가능하다면 항상 속성에
public
특성 대신protected
특성 또는private
특성을 사용하십시오. 일부public
속성은protected
속성과private
속성보다 액세스 속도가 느립니다.stepImpl
메서드에서 속성에 두 번 이상 액세스하는 경우 메서드 내부에서 해당 속성을 지역 변수로 캐시하십시오. 속성에 여러 번 액세스하는 일반적인 예로 루프를 들 수 있습니다. 캐시된 지역 변수를 사용하는 반복 계산은 객체의 속성에 액세스해야 하는 계산보다 실행 속도가 빠릅니다. 메서드에 대한 계산이 완료되면 로컬에 캐시된 결과를 해당 System object의 속성에 다시 저장할 수 있습니다. 자주 사용하는 조정 가능형 속성을 프라이빗 속성에 복사합니다. 이 모범 사례는updateImpl
메서드와outputImpl
메서드에도 적용됩니다.예를 들어, 다음 코드에서
k
는 각 루프 반복에서 여러 번 액세스되지만, 객체 속성에는 한 번만 저장됩니다.function y = stepImpl(obj,x) k = obj.MyProp; for p=1:100 y = k * x; k = k + 0.1; end obj.MyProp = k; end
속성의 디폴트 값은 객체의 모든 인스턴스에서 공유됩니다. 한 클래스의 두 인스턴스는 어느 한 인스턴스가 해당 속성을 덮어쓰지 않은 경우 같은 디폴트 값에 액세스할 수 있습니다.
텍스트 비교
stepImpl
메서드에 문자형 벡터 비교 또는 문자형 벡터 기반 switch 문을 사용하지 마십시오. 대신 setupImpl
에 메서드 핸들을 만드십시오. 이 핸들은 동일한 클래스 정의 파일에 있는 메서드를 가리킵니다. stepImpl
의 루프에 이 핸들을 사용하십시오.
이 예제에서는 루프에 메서드 핸들과 캐시된 지역 변수를 사용하여 효율적인 객체를 구현하는 방법을 보여줍니다. setupImpl
에서, 문자형 벡터 비교를 기준으로 myMethod1
또는 myMethod2
를 선택하고 메서드 핸들을 pMethodHandle
속성에 할당합니다. stepImpl
에 루프가 있으므로 pMethodHandle
속성을 로컬 메서드 핸들 myFun
에 할당한 다음 루프 내에 myFun
을 사용합니다.
classdef MyClass < matlab.System function setupImpl(obj) if strcmp(obj.Method, 'Method1') obj.pMethodHandle = @myMethod1; else obj.pMethodHandle = @myMethod2; end end function y = stepImpl(obj,x) myFun = obj.pMethodHandle; for p=1:1000 y = myFun(obj,x) end end end function y = myMethod1(x) y = x+1; end function y = myMethod2(x) y = x-1; end end
Simulink
Simulink에 포함된 System object의 경우, StrictDefaults
특성을 추가합니다. 이 특성은 기본적으로 false를 반환하도록 모든 MutableImpl
메서드를 설정합니다.
코드 생성
System object 및 코드 생성에 대한 자세한 내용은 System Objects in MATLAB Code Generation (MATLAB Coder) 항목을 참조하십시오.