Main Content

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) 항목을 참조하십시오.