주요 콘텐츠

MATLAB Engine을 사용하여 MATLAB Function 블록에서 함수 호출 실행하기

코드 생성기는 MATLAB® 코드에서 함수 foo에 대한 호출을 처리할 때 foo의 정의를 찾아내어 그 함수의 본문에 대응하는 코드를 생성합니다. 경우에 따라서는 코드 생성을 건너뛰고 대신 MATLAB 엔진을 사용하여 호출을 실행하고 싶을 수 있습니다. coder.extrinsic('foo')를 사용하면 foo에 대한 호출이 코드를 생성하지 않고 대신에 MATLAB 엔진을 사용하여 실행되도록 선언할 수 있습니다. 이 맥락에서의 foo를 외재적 함수라고 합니다. 이 기능은 실행하는 동안 MATLAB 엔진이 사용 가능한 상황에서만 이용할 수 있습니다. 이러한 상황의 예로는 MEX 함수 실행, Simulink® 시뮬레이션 또는 코드 생성 시점(컴파일 시점이라고도 함)에서의 함수 호출이 있습니다.

foo를 호출하고 coder.extrinsic('foo')를 포함하는 함수에 대한 독립 실행형 코드를 생성하는 경우, 코드 생성기는 foo가 출력에 영향을 미치는지 확인하려고 시도합니다. foo가 출력에 영향을 미치지 않으면 코드 생성기는 코드 생성을 계속 진행하지만 생성 코드에서 foo를 제외합니다. 그렇지 않으면 코드 생성기는 컴파일 오류를 생성합니다.

특정 MATLAB 함수 내에 coder.extrinsic('foo') 지시문을 포함하면 해당 MATLAB 함수 내에서 foo에 대한 모든 호출이 외재적 호출로 선언됩니다. 또는 외재적 선언의 범위를 foo에 대한 단 한 번의 호출로 좁힐 수도 있습니다. feval을 사용하여 MATLAB 함수 호출하기 (MATLAB Coder) 항목을 참조하십시오.

This image shows the flowchart on what you should do when using the MATLAB engine to execute the call to a function.

함수를 외재적 함수로 선언하는 경우

다음은 MATLAB 함수를 외재적 함수로 선언하는 것을 고려할 수 있는 몇 가지 일반적인 상황입니다.

  • 함수가 표시 동작이나 기록 동작을 수행합니다. 이러한 함수는 주로 시뮬레이션 중에 유용하며 임베디드 시스템에서는 사용되지 않습니다.

  • MEX 실행이나 Simulink 시뮬레이션에서 코드 생성을 지원하지 않는 MATLAB 함수를 사용하려고 합니다. 이 워크플로는 비시뮬레이션 타깃에는 적용되지 않습니다.

  • coder.const를 사용하여 함수 호출을 상수 폴딩하도록 코드 생성기에 지시합니다. 이러한 상황에서는 함수 호출을 실행하기 위하여 코드 생성 중에 MATLAB 엔진을 사용할 수 있는 경우에만 해당 함수가 호출됩니다.

coder.extrinsic 구문 사용하기

함수 foo를 외재적 함수로 선언하려면 MATLAB 코드에 다음 명령문을 포함하십시오.

coder.extrinsic('foo')

코드 생성을 위해 함수를 외재적 함수로 선언할 때는 다음 규칙을 준수하십시오.

  • 함수를 호출하기 전에 함수를 외재적 함수로 선언합니다.

  • 조건문에서 외재적 선언을 사용하지 않습니다.

  • 외재적 함수의 반환 값을 알려진 유형에 할당합니다. mxArrays 사용하기 (MATLAB Coder) 항목을 참조하십시오.

추가 정보와 예제는 coder.extrinsic을 참조하십시오.

코드 생성기는 plot, disp, figure처럼 널리 쓰이는 여러 MATLAB 시각화 함수를 자동으로 외재적 함수로 처리합니다. 이러한 함수는 coder.extrinsic을 사용하여 명시적으로 외재적 함수로 선언할 필요가 없습니다. 예를 들어 MATLAB 환경에서 plot을 호출하여 결과를 시각화하고 싶을 수 있습니다. plot을 호출하는 함수에서 MEX 함수를 생성한 다음 생성된 MEX 함수를 실행하면 코드 생성기가 plot 함수에 대한 호출을 MATLAB 엔진으로 디스패치합니다. 라이브러리나 실행 파일을 생성하는 경우 생성 코드에는 plot 함수에 대한 호출이 포함되지 않습니다.

MATLAB Coder™를 사용하여 MEX 코드나 독립 실행형 C/C++ 코드를 생성하는 경우 코드 생성 리포트는 MATLAB 코드에서의 외재적 함수에 대한 호출을 강조 표시합니다. 보고서를 검사하여 어떤 함수가 MATLAB 환경에서만 지원되는지 확인할 수 있습니다.

This image shows the report for the function mystats. The cursor points to the extrinsic function, plot, and the report displays the function properties. The extrinsic function is purple.

외재적 함수 선언 범위

coder.extrinsic 구문에는 함수 범위가 있습니다. 예를 들어, 다음 코드를 살펴보겠습니다.

function y = foo %#codegen
coder.extrinsic('rat','min');
[N D] = rat(pi);
y = 0;
y = min(N, D);

이 예제에서 ratmin은 메인 함수 foo에서 호출될 때마다 외재적 함수로 처리됩니다. 메인 함수 내에서 외재적 선언의 범위를 좁히는 방법에는 두 가지가 있습니다.

  • 다음 예제와 같이 로컬 함수에서 MATLAB 함수를 외재적 함수로 선언합니다.

    function y = foo %#codegen
    coder.extrinsic('rat');
    [N D] = rat(pi);
    y = 0;
    y = mymin(N, D);
     
    function y = mymin(a,b)
    coder.extrinsic('min');
    y = min(a,b);
    

    여기서 함수 rat는 메인 함수 foo 내부에서 호출될 때마다 외재적이지만, 함수 min은 로컬 함수 mymin 내부에서 호출될 때에만 외재적입니다.

  • coder.extrinsic 구문을 사용하는 대신 feval을 사용하여 MATLAB 함수를 호출합니다. 이 방식은 다음 섹션에서 설명합니다.

비정적 메서드에 대한 외재적 선언

비정적 메서드 foo가 있는 myClass 클래스를 정의한 다음 이 클래스의 인스턴스 obj를 생성한다고 가정해 보겠습니다. 코드 생성을 의도하는 MATLAB 코드에서 메서드 obj.foo를 외재적으로 선언하려면 다음 규칙을 따르십시오.

  • foo에 대한 호출을 함수 호출로 작성합니다. 점 표기법을 사용하여 호출을 작성하지 마십시오.

  • 구문 coder.extrinsic('foo')를 사용하여 foo를 외재적으로 선언합니다.

예를 들어, myClass를 다음과 같이 정의합니다.

classdef myClass
    properties
        prop = 1
    end
    methods
        function y = foo(obj,x)
            y = obj.prop + x;
        end
    end
end

다음은 foo를 외재적으로 선언하는 MATLAB 함수의 예제입니다.

function y = myFunction(x) %#codegen
coder.extrinsic('foo');
obj = myClass;
y = foo(obj,x);
end

비정적 메서드는 일반 메서드라고도 합니다. 메서드 구문 항목을 참조하십시오.

추가 용도

coder.extrinsic 구문을 사용하면 다음을 수행할 수 있습니다.

  • 출력을 생성하지 않는 MATLAB 함수를, 시뮬레이션 중에 불필요한 코드를 생성하지 않고 호출합니다.

  • 코드를 자체 문서화하고 디버그하기 쉽게 만듭니다. 소스 코드에서 coder.extrinsic 문을 스캔하여 MATLAB 함수에 대한 호출을 분리할 수 있으며, 이를 통해 가능한 경우 mxArrays를 생성하고 전파할 수 있습니다. mxArrays 사용하기 (MATLAB Coder) 항목을 참조하십시오.

feval을 사용하여 MATLAB 함수 호출하기

외재적 선언의 범위를 단 한 번의 함수 호출로 좁히려면 함수 feval을 사용하십시오. feval은 코드 생성 중에 자동으로 외재적 함수로 해석됩니다. 따라서 생성 코드를 컴파일하는 대신 feval을 사용하여 MATLAB 환경에서 실행하려는 함수를 호출할 수 있습니다.

다음 예제를 살펴보겠습니다.

function y = foo 
coder.extrinsic('rat');
[N D] = rat(pi);
y = 0;
y = feval('min',N,D);

feval이 외재적 함수이기 때문에 feval('min',N,D) 문은 MATLAB이 실행하게 되며, 컴파일되지 않으므로 이 한 번의 호출에 대해서는 함수 min을 외재적 함수로 선언한 것과 같은 결과가 됩니다. 반면에, 함수 rat는 함수 foo 전체에서 외재적입니다.

코드 생성기는 로컬 함수나 프라이빗 폴더에 있는 함수를 호출할 때 feval 사용을 지원하지 않습니다.

mxArrays 사용하기

외재적 함수의 런타임 출력값은 MATLAB 배열이라고도 하는 mxArray입니다. mxArrays에 대해서만 유효한 작업은 다음과 같습니다.

  • mxArray를 변수에 저장합니다.

  • mxArray를 외재적 함수에 전달합니다.

  • mxArray를 함수에서 MATLAB으로 다시 반환합니다.

  • mxArray를 런타임에 알려진 유형으로 변환합니다. mxArray를 사전 할당을 통해 유형이 이미 정의된 변수에 할당합니다. 다음 예제를 참조하십시오.

외재적 함수에서 반환된 mxArray를 다른 작업에서 사용하려면(예: MATLAB Function 블록에서 Simulink 실행으로 반환된 경우) 먼저 알려진 유형으로 변환해야 합니다.

함수의 입력 인수가 mxArrays인 경우 코드 생성기는 함수를 자동으로 외재적 함수로 처리합니다.

mxArrays를 알려진 유형으로 변환하기

mxArray를 알려진 유형으로 변환하려면 유형이 정의된 변수에 mxArray를 할당하십시오. 런타임에 mxArray는 할당된 변수의 유형으로 변환됩니다. mxArray의 데이터가 변수의 유형과 일치하지 않으면 런타임 오류가 발생합니다.

예를 들어, 다음 코드를 살펴보겠습니다.

function y = foo %#codegen
coder.extrinsic('rat');
[N D] = rat(pi);
y = min(N,D);

여기서 최상위 함수 foo는 외재적 MATLAB 함수 rat를 호출하며, 이 함수는 pi의 유리 분수 근사의 분자 N과 분모 D를 나타내는 두 개의 mxArrays를 반환합니다. 이러한 mxArrays를 다른 MATLAB 함수(이 경우 min)에 전달할 수 있습니다. min에 전달된 입력값은 mxArrays이므로 코드 생성기는 min을 자동으로 외재적 함수로 처리합니다. 결과적으로 minmxArray를 반환합니다.

MATLAB Coder를 사용하여 MEX 함수를 생성할 경우, MEX 함수는 MATLAB에 출력을 반환하므로 min에서 반환된 이 mxArray를 출력 y에 직접 할당할 수 있습니다.

codegen foo
Code generation successful.

그러나 Simulink 모델의 MATLAB Function 블록에 foo를 배치한 다음 모델을 업데이트하거나 실행하면 다음 오류가 표시됩니다.

코드 생성 시, 이 컨텍스트에서 이 함수의 mxArray 출력값은 지원되지 않습니다. 출력 변수 'y'를 알려진 유형으로 초기화하십시오.(Code generation does not support mxArray output from this function in this context. Initialize output variable 'y' with a known type.)

이 오류는 mxArray를 Simulink로 다시 반환하는 것이 지원되지 않기 때문에 발생합니다. 이 문제를 해결하려면 ymin이 반환할 것으로 예상되는 값의 유형과 크기(이 경우 double형 스칼라)로 정의하십시오.

function y = foo %#codegen
coder.extrinsic('rat');
[N D] = rat(pi);
y = 0; % Define y as a scalar of type double
y = min(N,D);

이 예제에서 외재적 함수 min의 출력은 코드를 생성하고자 하는 진입점 함수 foo의 출력 y에 영향을 미칩니다. foo에 대한 독립 실행형 코드(예: 정적 라이브러리)를 생성하려고 하면 코드 생성기는 외재적 함수 호출을 무시할 수 없으므로 코드 생성 오류가 발생합니다.

codegen -config:lib foo

외재적 함수 'min'의 출력값이 호출하는 함수에 영향을 미치는 것처럼 보이므로 독립 실행형 코드를 생성할 수 없습니다. 'min'에 대한 호출을 제거하거나 해당 출력값이 사용되지 않도록 하십시오.(Unable to generate standalone code because the output of the extrinsic function 'min' appears to influence the calling function. Eliminate the call to 'min' or ensure that its output is not used.)

외재적 함수 사용 제한 사항

코드 생성 중에는 완전한 MATLAB 런타임 환경이 지원되지 않습니다. 따라서 MATLAB 함수를 외재적으로 호출할 때 다음과 같은 제한 사항이 적용됩니다.

  • 호출자를 검사하거나, 호출자 작업 공간을 읽거나 쓰는 일부 MATLAB 함수는 코드 생성 시 지원되지 않습니다. 이러한 함수는 다음과 같습니다.

  • 외재적 함수가 런타임에 다음 동작을 수행하는 경우 생성 코드의 함수가 예상치 못한 결과를 낳을 수 있습니다:

    • 폴더 변경

    • MATLAB 경로 변경

    • MATLAB 파일 삭제 또는 추가

    • 경고 상태 변경

    • MATLAB 기본 설정 변경

    • Simulink 파라미터 변경

  • 코드 생성기는 프라이빗 폴더에 있는 함수를 호출할 때 coder.extrinsic 사용을 지원하지 않습니다.

  • 코드 생성기는 로컬 함수 또는 중첩 함수를 호출할 때 coder.extrinsic 사용을 지원하지 않습니다.

  • 코드 생성은 다음 항목에 해당하는 외재적 함수 또는 다음 항목을 포함하는 외재적 함수에 전달된 값이나 그러한 외재적 함수에서 반환된 값을 지원되지 않습니다.

    • 핸들 클래스

    • 함수 핸들

    • 불투명한(opaque로 선언된) 값(coder.opaque (MATLAB Coder) 항목 참조)

  • 최대 64개의 입력과 64개의 출력을 사용하여 외재적 함수를 호출할 수 있습니다.

참고 항목

|