명령줄에서 C 코드 생성하기
이 튜토리얼에서는 MATLAB® Coder™ codegen 명령을 사용하여 MATLAB 함수에 대한 정적 C 라이브러리를 생성합니다. 우선, 고정된 사전 할당 크기를 갖는 입력만 받을 수 있는 C 코드를 생성합니다. 그런 다음 다양한 크기의 입력을 받을 수 있는 C 코드를 생성합니다.
MATLAB Coder 앱을 사용하여 코드를 생성할 수도 있습니다. 이 워크플로에 대한 튜토리얼은 MATLAB Coder 앱을 사용하여 C 코드 생성하기 항목을 참조하십시오.
MATLAB Coder는 스크립트가 아니라 MATLAB 함수로부터 코드를 생성합니다. MATLAB 코드가 스크립트 형식인 경우에는 코드를 생성하기 전에 스크립트를 감싸는 래퍼 함수를 만드십시오.
튜토리얼 파일: 유클리드 거리(Euclidean Distance)
이 예제를 열어 이 튜토리얼을 위한 파일을 가져옵니다.
튜토리얼 파일에 대한 설명
이 튜토리얼에서는 euclidean_data.mat, euclidean.m, euclidean_test.m, build_lib_fixed.m, build_lib_variable.m 파일을 사용합니다.
MATLAB 데이터 파일
euclidean_data.mat에는 두 가지 데이터가 포함되어 있는데, 하나는 3차원 유클리드 공간의 단일 점이고 다른 하나는 3차원 유클리드 공간의 다른 여러 점 세트입니다. 구체적으로 살펴보겠습니다.x는 3차원 유클리드 공간의 한 점을 나타내는3×1열 벡터입니다.cb는3×216배열입니다.cb의 각 열은 3차원 유클리드 공간의 한 점을 나타냅니다.
MATLAB 파일
euclidean.m에는 이 예제의 핵심 알고리즘을 구현하는 함수euclidean이 포함되어 있습니다. 이 함수는x와cb를 입력으로 받습니다. 이 함수는x와cb의 각 점 간 유클리드 거리를 계산하고 다음 수량을 반환합니다.열 벡터
y_min.x에 가장 가까운 점을 나타내는cb의 열입니다.열 벡터
y_max.x에서 가장 먼 점을 나타내는cb의 열입니다.cb에서 벡터y_min과 벡터y_max의 열 인덱스가 포함된 2차원 벡터idx.x까지의 거리를 계산했을 때의 최소 거리와 최대 거리가 포함된 2차원 벡터distance.
function [y_min,y_max,idx,distance] = euclidean(x,cb) % Initialize minimum distance as distance to first element of cb % Initialize maximum distance as distance to first element of cb idx(1)=1; idx(2)=1; distance(1)=norm(x-cb(:,1)); distance(2)=norm(x-cb(:,1)); % Find the vector in cb with minimum distance to x % Find the vector in cb with maximum distance to x for index=2:size(cb,2) d=norm(x-cb(:,index)); if d < distance(1) distance(1)=d; idx(1)=index; end if d > distance(2) distance(2)=d; idx(2)=index; end end % Output the minimum and maximum distance vectors y_min=cb(:,idx(1)); y_max=cb(:,idx(2)); end
MATLAB 스크립트
euclidean_test.m은 데이터 파일euclidean_data.mat를 작업 공간으로 불러옵니다. 그런 다음 함수euclidean을 호출하여y_min,y_max,idx,distance를 계산합니다. 그러면 스크립트는 계산된 수량을 명령줄에 표시합니다.euclidean_data.mat불러오기는 핵심 알고리즘을 호출하기 전에 실행되는 전처리 단계입니다. 결과 표시는 후처리 단계입니다.% Load test data load euclidean_data.mat % Determine closest and farthest points and corresponding distances [y_min,y_max,idx,distance] = euclidean(x,cb); % Display output for the closest point disp('Coordinates of the closest point are: '); disp(num2str(y_min')); disp(['Index of the closest point is ', num2str(idx(1))]); disp(['Distance to the closest point is ', num2str(distance(1))]); disp(newline); % Display output for the farthest point disp('Coordinates of the farthest point are: '); disp(num2str(y_max')); disp(['Index of the farthest point is ', num2str(idx(2))]); disp(['Distance to the farthest point is ', num2str(distance(2))]);
빌드 스크립트
build_lib_fixed.m과build_lib_variable.m에는 MATLAB 코드를 사용하여 각각 고정 크기 입력과 가변 크기 입력을 받는 정적 C 라이브러리를 생성하기 위한 명령이 포함되어 있습니다. 이러한 스크립트의 내용은 나중에 이 튜토리얼에서 C 코드를 생성할 때 나옵니다.
팁
테스트 스크립트를 사용하여 핵심 알고리즘을 구현하는 함수로부터 전처리 단계와 후처리 단계를 분리합니다. 이 방법을 통해 알고리즘을 쉽게 재사용할 수 있습니다. 핵심 알고리즘을 구현하는 MATLAB 함수에 대한 코드를 생성합니다. 테스트 스크립트용 코드는 생성하지 않습니다.
MATLAB 함수에 대한 C 코드 생성하기
원래 MATLAB 코드 실행하기
MATLAB에서 테스트 스크립트 euclidean_test.m을 실행합니다. 출력값으로는 y, idx, distance가 표시됩니다.
Coordinates of the closest point are: 0.8 0.8 0.4 Index of the closest point is 171 Distance to the closest point is 0.080374 Coordinates of the farthest point are: 0 0 1 Index of the farthest point is 6 Distance to the farthest point is 1.2923
MATLAB 코드를 코드 생성에 적합하게 만들기
MATLAB 코드를 코드 생성에 적합하게 만들려면 코드 분석기와 코드 생성 준비 툴을 사용하십시오. MATLAB 편집기의 코드 분석기는 입력되는 코드를 계속해서 검사합니다. 또한 문제를 보고하며, 성능과 유지 관리성을 극대화할 수 있도록 수정 사항을 제안합니다. 코드 생성 준비 툴은 MATLAB 코드에 코드 생성이 지원되지 않는 기능과 함수가 있는지 검사합니다.
C/C++ 코드 생성을 위해 지원되는 특정 MATLAB 내장 함수와 툴박스 함수, 클래스, System object에는 특정 코드 생성 제한 사항이 있습니다. 이러한 제한 사항과 사용법 관련 참고 사항은 해당 도움말 페이지의 확장 기능 섹션에 나열되어 있습니다. 자세한 내용은 C/C++ 코드 생성에 지원되는 함수 및 객체 항목을 참조하십시오.
MATLAB 편집기에서
euclidean.m을 엽니다. MATLAB 편집기의 오른쪽 위 코너에 있는 코드 분석기 메시지 표시자가 녹색입니다. 분석기가 코드에서 오류, 경고 또는 코드 개선 방법을 감지하지 않았습니다.함수 선언 뒤에
%#codegen지시문을 추가합니다.function [y,idx,distance] = euclidean(x,cb) %#codegen
%#codegen지시문은 코드 생성과 관련된 경고와 오류를 식별하도록 코드 분석기에 지시합니다.코드 분석기 메시지 표시자가 빨간색으로 변경되어 코드 생성 문제를 감지되었음을 나타냅니다.

경고 메시지를 보려면 밑줄이 표시된 코드 조각으로 커서를 이동합니다. 경고는 코드 생성 시 첨자를 사용하여 값을 할당하기 전에 변수
idx와 변수distance를 완전히 정의해야 한다는 것을 나타냅니다. 이러한 경고가 표시되는 이유는 변수가 코드에 처음 나타날 때 코드 생성기가 변수의 크기를 결정하기 때문입니다. 이 문제를 해결하려면ones함수를 사용하여 배열의 할당과 초기화를 동시에 수행합니다.% Initialize minimum distance as distance to first element of cb % Initialize maximum distance as distance to first element of cb idx = ones(1,2); distance = ones(1,2)*norm(x-cb(:,1));
코드 분석기 메시지 표시자가 다시 녹색으로 변경되어 더 이상 코드 생성 문제가 감지되지 않음을 나타냅니다.

코드 분석기 사용에 대한 자세한 내용은 코드 분석기를 사용하여 코드에서 오류와 경고 확인하기 항목을 참조하십시오.
파일을 저장합니다.
코드 생성 준비 툴을 실행하려면 MATLAB 명령줄에서
coder.screener함수를 호출합니다.coder.screener('euclidean')이 툴은
euclidean의 코드 생성 문제를 감지하지 못합니다. 자세한 내용은 코드 생성 준비 툴 항목을 참조하십시오.참고
코드 분석기와 코드 생성 준비 툴이 모든 코드 생성 문제를 감지하지 못할 수도 있습니다. 이러한 툴에서 감지한 오류나 경고를 제거한 후에는 MATLAB Coder를 사용해 코드를 생성하여 MATLAB 코드에 다른 규정 준수 문제가 있는지 확인하십시오.
이제 codegen 명령을 사용하여 코드를 컴파일할 준비가 되었습니다. 여기의 컴파일은 MATLAB 코드로부터 C/C++ 코드를 생성한다는 것을 의미합니다.
참고
MATLAB 코드를 컴파일한다는 것은 MATLAB 코드로부터 C/C++ 코드를 생성한다는 것을 의미합니다. 다른 문맥에서 컴파일이라는 용어는 C/C++ 컴파일러의 작업을 의미할 수도 있습니다.
입력 유형 정의하기
C는 정적으로 유형이 지정(static typing)되므로 코드 생성기는 코드 생성 시점(컴파일 시간이라고도 함)에 MATLAB 파일에 있는 모든 변수의 클래스, 크기, 실수/복소수 여부를 확인해야 합니다. 따라서 파일에 대한 코드를 생성할 때 진입점 함수에 대한 모든 입력 인수의 속성을 지정해야 합니다. 진입점 함수는 코드 생성의 기반이 되는 최상위 MATLAB 함수입니다.
codegen 명령을 사용하여 코드를 생성할 때 -args 옵션을 사용하여 진입점 함수에 대한 샘플 입력 파라미터를 지정하십시오. 코드 생성기는 이 정보를 사용하여 입력 인수의 속성을 결정합니다.
다음 단계에서는 codegen 명령을 사용하여 진입점 함수 euclidean에서 MEX 파일을 생성합니다.
런타임 문제 검사하기
진입점 함수에서 MEX 함수를 생성합니다. MEX 함수는 MATLAB 내부로부터 호출될 수 있는 생성 코드입니다. MEX 함수를 실행하고 생성된 MEX 함수와 원래 MATLAB 함수의 기능이 동일한지 확인합니다.
이 단계를 수행하는 것이 가장 좋습니다. 왜냐하면 생성된 C 코드에서 진단하기 어려운 런타임 오류를 감지하고 수정할 수 있기 때문입니다. 기본적으로 MEX 함수에는 메모리 무결성 검사가 포함되어 있습니다. 여기서는 배열 경계 검사와 차원 검사를 수행합니다. 또한 MATLAB 함수에 대해 생성된 코드에서 메모리 무결성 위반을 감지합니다. 자세한 내용은 Control Run-Time Checks 항목을 참조하십시오.
MATLAB 코드를 효율적인 C/C++ 소스 코드로 변환할 수 있도록 코드 생성기에는 특정 상황에서 생성 코드가 원래 소스 코드와 다르게 동작하도록 하는 최적화가 도입되었습니다. Differences Between Generated Code and MATLAB Code 항목을 참조하십시오.
codegen명령을 사용하여euclidean.m에 대한 MEX 파일을 생성합니다. MEX 함수를 검증하려면 MATLAB 함수euclidean에 대한 호출을 생성된 MEX 함수에 대한 호출로 대체하여 테스트 스크립트euclidean_test를 실행합니다.% Load the test data load euclidean_data.mat % Generate code for euclidean.m with codegen. Use the test data as example input. codegen euclidean.m -args {x,cb} -test euclidean_test
기본적으로
codegen은 현재 폴더에 이름이euclidean_mex인 MEX 함수를 생성합니다.-args옵션을 사용하여 진입점 함수euclidean에 대한 샘플 입력 파라미터를 지정합니다. 코드 생성기는 이 정보를 사용하여 입력 인수의 속성을 결정합니다.-test옵션을 사용하여 테스트 파일euclidean_test.m을 실행합니다. 이 옵션은 테스트 파일에서euclidean에 대한 호출을euclidean_mex에 대한 호출로 대체합니다.
출력은 다음과 같습니다.
이 출력은 원래 MATLAB 함수로 생성된 출력과 일치하며 MEX 함수를 검증합니다. 이제Running test file: 'euclidean_test' with MEX function 'euclidean_mex'. Coordinates of the closest point are: 0.8 0.8 0.4 Index of the closest point is 171 Distance to the closest point is 0.080374 Coordinates of the farthest point are: 0 0 1 Index of the farthest point is 6 Distance to the farthest point is 1.2923
euclidean에 대한 독립 실행형 C 코드를 생성할 준비가 되었습니다.
참고
MATLAB 코드에서 독립 실행형 C/C++ 코드를 생성하기 전에 MEX 함수를 생성합니다. 생성된 MEX 함수를 실행하고 런타임 동작이 MATLAB 함수와 동일한지 확인합니다. 생성된 MEX 함수가 MATLAB과 다른 답을 생성하거나 오류가 발생하는 경우, 독립 실행형 코드 생성을 진행하기 전에 이러한 문제를 해결해야 합니다. 그렇지 않으면 생성되는 독립 실행형 코드를 신뢰할 수 없으며 정의되지 않은 동작이 초래될 수 있습니다.
C 코드 생성하기
빌드 스크립트 build_lib_fixed.m에는 euclidean.m에 대한 코드를 생성하는 데 사용하는 명령이 포함되어 있습니다.
% Load the test data load euclidean_data.mat % Generate code for euclidean.m with codegen. Use the test data as example input. codegen -report -config:lib euclidean.m -args {x, cb}
codegen은 파일euclidean.m을 읽고 MATLAB 코드를 C 코드로 변환합니다.-report옵션은 코드 생성 문제를 디버그하고 MATLAB 코드가 코드 생성에 적합한지 검증하는 데 사용할 수 있는 코드 생성 보고서를 생성하도록codegen에 지시합니다.-config:lib옵션은 디폴트 MEX 함수를 생성하는 대신 정적 C 라이브러리를 생성하도록codegen에 지시합니다.-args옵션은 샘플 입력 파라미터x와cb의 클래스, 크기, 실수/복소수 여부를 사용하여euclidean.m에 대한 코드를 생성하도록codegen에 지시합니다.
C 정적 라이브러리를 생성하는 대신 codegen 명령과 함께 적합한 옵션을 사용하여 MEX 함수나 기타 C/C++ 빌드 유형을 생성하도록 선택할 수 있습니다. 다양한 코드 생성 옵션에 대한 자세한 내용은 codegen을 참조하십시오.
빌드 스크립트를 실행합니다.
MATLAB이 빌드 파일을 처리하고 다음 메시지를 출력합니다.
코드 생성기는 독립 실행형 C 정적 라이브러리Code generation successful: View report.euclidean을에 생성합니다. 여기서work\codegen\lib\euclidean는 튜토리얼 파일이 포함된 폴더입니다.work리포트 뷰어에서 코드 생성 리포트를 보려면 리포트 보기를 클릭합니다.
코드 생성 중에 코드 생성기가 오류 또는 경고를 감지하면 리포트는 해당 문제에 대한 설명을 제공하고 문제가 있는 MATLAB 코드에 대한 링크를 제공합니다. Code Generation Reports 항목을 참조하십시오.
팁
명령줄에서 빌드 스크립트를 사용하여 코드를 생성하십시오. 빌드 스크립트는 명령줄에서 반복적으로 수행하는 일련의 MATLAB 명령을 자동화하여 시간을 절약하고 입력 오류를 없앱니다.
생성된 C 코드와 원래 MATLAB 코드 비교하기
생성된 C 코드와 원래 MATLAB 코드를 비교하기 위해, C 파일 euclidean.c를 열고 MATLAB 편집기에서 euclidean.m 파일을 엽니다.
생성된 C 코드에 대한 중요 정보:
함수 시그니처는 다음과 같습니다.
void euclidean(const double x[3], const double cb[648], double y_min[3], double y_max[3], double idx[2], double distance[2])const double x[3]은 MATLAB 코드에서 입력값x에 상응합니다.x의 크기는3이며, 이는 MATLAB 코드에 대한 코드를 생성할 때 사용한 예제 입력값의 총 크기(3 x 1)에 상응합니다.const double cb[648]은 MATLAB 코드에서 입력값cb에 상응합니다.cb의 크기는648이며, 이는 MATLAB 코드에 대한 코드를 생성할 때 사용한 예제 입력값의 총 크기(3 x 216)에 상응합니다. 이 경우 생성 코드는 1차원 배열을 사용하여 MATLAB 코드에서 2차원 배열을 표현합니다.생성 코드에는 네 개의 추가 입력 인수인 배열
y_min, 배열y_max, 배열idx, 배열distance가 있습니다. 이러한 배열을 사용하여 출력값을 반환합니다. 각각은 원래 MATLAB 코드에서 출력 인수y_min,y_max,idx,distance에 상응합니다.코드 생성기는 함수 이름과 주석을 보존합니다. 가능한 경우 코드 생성기는 변수 이름을 보존합니다.
참고
MATLAB 코드에서 변수가 상수 값으로 설정된 경우에는 생성된 C 코드에 변수로 표시되지 않습니다. 대신, 생성된 C 코드에는 변수의 실제 값이 포함됩니다.
Embedded Coder®를 사용하면 MATLAB 코드와 생성된 C/C++ 코드 사이에서 대화형 방식으로 추적할 수 있습니다. Interactively Trace Between MATLAB Code and Generated C/C++ Code (Embedded Coder) 항목을 참조하십시오.
가변 크기 입력값에 대한 C 코드 생성하기
euclidean.m에 대해 생성된 C 함수는 코드 생성 중에 사용자가 지정한 샘플 입력값과 크기가 같은 입력값만 받을 수 있습니다. 그러나 상응하는 MATLAB 함수에 대한 입력 배열은 어떤 크기여도 상관없습니다. 튜토리얼의 이 부분에서는 가변 크기 입력값을 받는 C 코드를 euclidean.m으로부터 생성합니다.
생성된 C 코드의 x 차원과 cb 차원에 다음 속성을 설정하고자 한다고 가정하겠습니다.
x의 첫 번째 차원과cb의 첫 번째 차원은 최대3까지의 크기를 가질 수 있습니다.x의 두 번째 차원은 고정이며 값1을 갖습니다.cb의 두 번째 차원은 최대216까지의 크기를 가질 수 있습니다.
이러한 입력 속성을 지정하려면 coder.typeof 함수를 사용하십시오. coder.typeof(A,B,1)은 A와 클래스 및 실수/복소수 여부가 동일하고 크기 벡터 B에서 상응하는 요소로 지정된 상한을 갖는 가변 크기 입력을 지정합니다. 생성된 C 코드에서 가변 크기 입력의 속성을 지정하려면 coder.typeof를 사용하는 빌드 스크립트 build_lib_variable.m을 사용하십시오.
% Load the test data load euclidean_data.mat % Use coder.typeof to specify variable-size inputs eg_x=coder.typeof(x,[3 1],1); eg_cb=coder.typeof(cb,[3 216],1); % Generate code for euclidean.m using coder.typeof to specify % upper bounds for the example inputs codegen -report -config:lib euclidean.m -args {eg_x,eg_cb}
이제 이전과 동일한 단계에 따라 코드를 생성할 수 있습니다. 이제 euclidean.c에 생성된 C 코드의 함수 시그니처는 다음과 같습니다.
void euclidean(const double x_data[], const int x_size[1], const double cb_data[],
const int cb_size[2], double y_min_data[], int y_min_size[1],
double y_max_data[], int y_max_size[1], double idx[2], double
distance[2])x_data, cb_data, y_min_data, y_max_data는 원래 MATLAB 함수에 있는 입력 인수 x와 cb, 그리고 출력 인수 y_min과 y_max에 상응합니다. 이제 C 함수는 네 개의 추가 입력 인수 x_size, cb_size, y_min_size, y_max_size를 받으며, 각각은 런타임에 x_data 크기, cb_data 크기, y_min_data 크기, y_max_data 크기를 지정합니다.참고 항목
도움말 항목
- C/C++ 코드 생성에 지원되는 함수 및 객체
- C++ 코드 생성
- Create and Edit Input Types by Using the Coder Type Editor
- Use an Example C Main in an Application
- Package Code for Other Development Environments
- Optimize Generated C/C++ and MEX Code
- Call Custom C/C++ Code from the Generated Code
- Code Generation Reports
- Interactively Trace Between MATLAB Code and Generated C/C++ Code (Embedded Coder)