MATLAB Coder 앱을 사용하여 C 코드 생성하기
이 튜토리얼에서는 MATLAB® Coder™ 앱을 사용하여 MATLAB 함수에 대한 C 소스 코드를 생성합니다. 우선, 고정된 사전 할당 크기를 갖는 입력만 받을 수 있는 C 코드를 생성합니다. 그런 다음 다양한 크기의 입력을 받을 수 있는 C 코드를 생성합니다.
MATLAB 명령줄에서 codegen 명령을 사용하여 코드를 생성할 수도 있습니다. 튜토리얼은 명령줄에서 C 코드 생성하기 항목을 참조하십시오.
MATLAB Coder는 스크립트가 아니라 MATLAB 함수로부터 코드를 생성합니다. MATLAB 코드가 스크립트 형식인 경우에는 코드를 생성하기 전에 스크립트를 감싸는 래퍼 함수를 만드십시오.
튜토리얼 파일: 유클리드 거리(Euclidean Distance)
이 예제를 열어 이 튜토리얼을 위한 파일을 가져옵니다.
튜토리얼 파일에 대한 설명
이 튜토리얼에서는 euclidean_data.mat 파일, euclidean.m 파일, euclidean_test.m 파일을 사용합니다.
MATLAB 데이터 파일
euclidean_data.mat에는 다음 두 가지 데이터가 포함되어 있습니다.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의 열입니다.2차원 벡터
idx.cb에서 벡터y_min과 벡터y_max가 위치한 열의 인덱스를 포함합니다.2차원 벡터
distance. 여기에는x까지 계산된 최소 거리와 최대 거리를 포함합니다.
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))]);
팁
테스트 스크립트를 사용하여 핵심 알고리즘을 구현하는 함수로부터 전처리 단계와 후처리 단계를 분리합니다. 이 방법을 통해 알고리즘을 쉽게 재사용할 수 있습니다. 핵심 알고리즘을 구현하는 MATLAB 함수에 대한 코드를 생성합니다. 테스트 스크립트용 코드는 생성하지 않습니다.
MATLAB 함수에 대한 C 코드 생성하기
MATLAB Coder 앱을 사용하여 함수 euclidean에 대한 C 소스 코드를 생성합니다. 이 단계에서 생성하는 코드는 고정된 사전 할당 크기를 갖는 입력만 받습니다.
원래 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 편집기에서
euclidean.m을 엽니다. MATLAB 편집기의 오른쪽 위 코너에 있는 코드 분석기 메시지 표시자가 녹색입니다. 분석기가 코드에서 오류, 경고 또는 코드 개선 방법을 감지하지 않았습니다.함수 선언 뒤에
%#codegen지시문을 추가합니다.function [y,idx,distance] = euclidean(x,cb) %#codegen
%#codegen지시문은 코드 생성과 관련된 경고와 오류를 식별하도록 코드 분석기에 지시합니다.코드 분석기 메시지 표시자가 빨간색으로 바뀌어 코드 생성 문제가 감지되었음을 나타냅니다.

경고 메시지를 보려면 밑줄이 표시된 코드 조각을 가리킵니다. 경고는 코드 생성 시 첨자를 사용하여 값을 할당하기 전에 변수
idx와 변수distance를 완전히 정의해야 한다는 것을 나타냅니다. 이러한 경고가 표시되는 이유는 변수가 코드에 처음 나타날 때 코드 생성기가 변수의 크기를 결정하기 때문입니다. 이 문제를 해결하려면ones함수를 사용하여 배열의 할당과 초기화를 동시에 수행합니다.idx = ones(1,2); distance = ones(1,2)*norm(x-cb(:,1));
코드 분석기에 "발견된 오류가 없음" 아이콘이 표시되어 더 이상 코드 생성 문제가 감지되지 않음을 나타냅니다.

코드 분석기 사용에 대한 자세한 내용은 코드 분석기를 사용하여 코드에서 오류와 경고 확인하기 항목을 참조하십시오.
파일을 저장합니다.
이제 MATLAB Coder 앱을 사용하여 코드를 컴파일할 준비가 되었습니다.
참고
MATLAB Coder에서 MATLAB 코드를 컴파일한다는 것은 MATLAB 코드로부터 C/C++ 코드를 생성한다는 것을 의미합니다. 다른 문맥에서 컴파일이라는 용어는 C/C++ 컴파일러의 작업을 의미합니다.
MATLAB Coder 앱을 열고 프로젝트 파일 만들기
MATLAB Coder 앱을 사용하여 코드를 생성하려면 먼저 확장자가 .coderprj인 MATLAB Coder 프로젝트 파일을 만들어야 합니다. 이 파일에는 MATLAB Coder 진입점 함수의 경로, 각각의 입력 유형, 전역 변수, 코드 생성 구성 파라미터 등 코드 생성기에 제공하는 정보가 포함되어 있습니다.
MATLAB 툴스트립의 앱 탭의 코드 생성에서 MATLAB Coder를 클릭합니다. 앱에 "MATLAB Coder 프로젝트 만들기" 대화 상자가 열립니다.
프로젝트 파일의 이름과 파일을 저장하려는 폴더를 제공합니다. 이 예제에서는 현재 작업 폴더에
euclidean.coderprj라는 파일을 만듭니다.
MATLAB Coder 툴스트립 탭이 열립니다. 탭에서 각 섹션은 C/C++ 코드 생성을 위한 MATLAB 코드 준비, 코드 생성, 생성된 코드에 대한 검증 수행, 코드 생성 리포트 보기, 생성된 코드 내보내기 등 코드 생성 시 수행하는 다양한 단계에 해당합니다.

MATLAB Coder 패널도 열립니다. 다음 단계 섹션에는 코드 생성 단계를 안내하는 메시지가 표시되며, 입력 섹션과 출력 섹션에는 코드 생성 입력과 출력이 요약됩니다.

MATLAB 진입점 함수 지정하기
진입점 함수는 코드 생성의 기반이 되는 최상위 MATLAB 함수입니다. 이 예제에서 진입점 함수는 euclidean입니다.
MATLAB Coder 패널의 다음 단계 섹션에서 빈 프로젝트에 진입점을 추가하라고 안내합니다.
진입점 함수를 추가하려면 다음을 수행하십시오.
MATLAB Coder 패널의 입력 섹션에서 진입점 추가 버튼을 클릭하거나 툴스트립에서 진입점 버튼을 클릭합니다.
진입점 탭이 열립니다. 진입점 함수의 이름
euclidean을 입력합니다.
앱이 이 진입점 함수에 대해 코드 생성 준비 툴을 실행합니다. 이 툴은 MATLAB 코드에 코드 생성이 지원되지 않는 기능과 함수가 있는지 검사합니다. 앱이 진입점 함수나 이 함수의 종속 항목과 관련된 문제를 식별하면 진입점 탭에 경고 메시지를 표시합니다. 메시지 옆에 있는 링크를 클릭하면 문제를 검토하고 수정할 수 있는 코드 생성 준비 툴이 별도의 창에 열립니다. 이 예제에서는 앱이 euclidean 함수에서 코드 생성 준비 문제를 감지하지 못했습니다. 자세한 내용은 코드 생성 준비 툴 항목을 참조하십시오.
참고
코드 분석기와 코드 생성 준비 툴이 모든 코드 생성 문제를 감지하지 못할 수도 있습니다. 이러한 두 툴에서 감지된 오류 또는 경고를 제거한 후 MATLAB Coder를 사용해 코드를 생성하여 MATLAB 코드에 다른 준수 문제가 있는지 확인하십시오.
C/C++ 코드 생성이 지원되는 일부 MATLAB 함수와 객체는 코드 생성 제한 사항이 있습니다. 이러한 제한 사항과 사용법 관련 참고 사항은 해당 도움말 페이지의 확장 기능 섹션에 있습니다. 자세한 내용은 C/C++ 코드 생성에 지원되는 함수 및 객체 항목을 참조하십시오.
입력 유형 정의하기
C/C++는 정적으로 유형이 지정(static typing)되므로 코드 생성기는 코드 생성 시점(컴파일타임이라고도 함)에 MATLAB 파일에 있는 변수의 클래스, 크기를 비롯한 기타 속성(예: 실수/복소수 여부)을 확인해야 합니다. 따라서 사용자는 모든 진입점 함수 입력값의 속성을 지정해야 합니다. 입력값 속성은 다음과 같이 지정할 수 있습니다.
다음을 통해 입력값 속성을 자동으로 확인하도록 앱에 지시합니다.
샘플 입력값을 사용해서 진입점 함수를 호출하는 스크립트를 제공합니다.
샘플 입력값을 사용해서 진입점 함수를 실행하는 명령을 명령 창에서 실행합니다.
속성을 직접 지정합니다.
이 예제에서는 입력값 x와 cb의 속성을 정의하기 위해, 코드 생성기가 유형을 자동으로 정의하는 데 사용할 수 있는 테스트 파일 euclidean_test.m을 지정합니다.
진입점 탭의 상단에서 입력 유형을 자동으로 정의 파라미터를
스크립트 사용으로 설정합니다.테스트 파일
euclidean_test.m을 입력하고 실행 버튼을 클릭합니다.
테스트 파일 euclidean_test.m이 예상되는 입력 유형을 사용하여 진입점 함수 euclidean을 호출합니다. 앱은 입력값 x는 double 3×1 배열이고 입력값 cb는 double 3×216 배열이라고 확인합니다.

MEX 함수를 생성하고 실행하기
생성된 MEX 실행 툴스트립 버튼은 진입점 함수로부터 MEX 함수를 생성하고 그 MEX 함수를 실행한 후 문제를 보고합니다. MEX 함수는 MATLAB 내부로부터 호출될 수 있는 생성 코드입니다. 이 단계를 수행하는 것이 가장 좋습니다. 왜냐하면 생성된 독립 실행형 C/C++ 코드에서 진단하기 어려운 런타임 오류를 감지하고 수정할 수 있기 때문입니다. 기본적으로 MEX 함수에는 메모리 무결성 검사가 포함되어 있습니다. 여기서는 배열 경계 검사와 차원 검사를 수행합니다. 또한 MATLAB 함수에 대해 생성된 코드에서 메모리 무결성 위반을 감지합니다. 자세한 내용은 Control Run-Time Checks 항목을 참조하십시오.
MATLAB Coder 툴스트립 탭에서 생성된 MEX 실행 드롭다운 메뉴를 엽니다.
샘플 입력값을 사용하여 진입점 함수를 호출하는 테스트 파일을 지정합니다. 이 예제에서는 입력 유형을 정의하는 데 사용한 테스트 파일
euclidean_test.m을 사용합니다.
앱이 MEX 함수를 생성합니다. 앱은 테스트 스트립트 euclidean_test를 실행하여 euclidean에 대한 호출을 생성된 MEX에 대한 호출로 대체합니다. MEX 함수 생성 또는 실행 중에 문제를 감지하면 앱이 명령 창에 경고 및 오류 메시지를 제공합니다. 이러한 메시지를 클릭하면 문제가 있는 코드로 이동하여 문제를 해결할 수 있습니다. 이 예제에서는 앱에서 문제가 감지되지 않았으며 코드 생성 패널의 출력 섹션에 다음 메시지가 표시됩니다.

팁
MATLAB 코드에서 독립 실행형 C/C++ 코드를 생성하기 전에 MEX 함수를 생성합니다. 특정 상황에서 코드 생성기는 MATLAB과 수치적 동작이 다른 코드를 생성할 수 있습니다. 따라서 생성된 MEX 함수를 실행하여 런타임 동작이 MATLAB 함수와 동일한지 확인하는 것이 가장 좋습니다. 생성된 MEX 함수가 MATLAB과 다른 답을 생성하거나 오류가 발생하는 경우, 독립 실행형 코드 생성을 진행하기 전에 이러한 문제를 해결해야 합니다. 그렇지 않으면 생성되는 독립 실행형 코드를 신뢰할 수 없으며 정의되지 않은 동작이 초래될 수 있습니다.
C 소스 코드 생성하기
툴스트립의 MATLAB Coder 탭의 준비 섹션에서 출력 유형이 정적 라이브러리(.lib)로 설정되어 있는지 확인합니다. 다른 코드 구성 설정은 디폴트 값을 사용합니다.
툴스트립의 코드 생성 버튼을 클릭합니다.
MATLAB Coder는 프로젝트의 C 소스 파일을
폴더에 생성합니다. 여기서work\codegen\lib\euclidean는 튜토리얼 파일이 포함된 폴더입니다. 출력 섹션에 코드 생성에 성공했음이 나타나며 생성된 출력 폴더와 코드 생성 리포트에 대한 링크가 표시됩니다.work
코드 생성 리포트를 클릭하여 리포트 뷰어에서 리포트를 봅니다. 코드 생성 중에 코드 생성기가 오류 또는 경고를 감지하면 리포트는 해당 문제에 대한 설명을 제공하고 문제가 있는 MATLAB 코드에 대한 링크를 제공합니다. 자세한 내용은 Code Generation Reports 항목을 참조하십시오.
코드 생성 버튼을 클릭하면 소스 코드만 생성되고 소스 코드를 빌드하여 이진 파일을 생성하지 않습니다. 소스 코드 생성과 이진 파일 빌드를 한 번에 모두 수행하려면 코드 생성 드롭다운 메뉴를 열고 코드 생성 및 빌드 옵션을 선택합니다. 또한 C 정적 라이브러리를 생성하는 대신 MEX 함수 빌드 유형이나 기타 C/C++ 빌드 유형을 생성하도록 선택할 수도 있습니다. MEX 빌드 유형과 C/C++ 빌드 유형에 서로 다른 코드 구성 설정을 사용할 수 있습니다. MEX 코드 생성과 C/C++ 코드 생성 간에 전환하는 경우에는 선택한 설정을 확인합니다.
MATLAB 코드를 효율적인 C/C++ 코드로 변환하기 위해 코드 생성기에 최적화를 도입하였는데, 이로 인해 경우에 따라 생성 코드가 원래 MATLAB 코드와 다르게 동작할 수 있습니다. Differences Between Generated Code and MATLAB Code 항목을 참조하십시오.
생성된 C 코드와 원래 MATLAB 코드 비교하기
생성된 C 코드와 원래 MATLAB 코드를 비교하기 위해, C 파일 euclidean.c를 열고 MATLAB 편집기에서 euclidean.m 파일을 엽니다.
euclidean.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.c의 C 함수는 코드 생성 중에 사용자가 지정한 샘플 입력값과 크기가 같은 입력값만 받을 수 있습니다. 그러나 상응하는 MATLAB 함수에 대한 입력 배열은 어떤 크기여도 상관없습니다.
생성된 C 코드의 x 차원과 cb 차원에 다음 속성을 설정하고자 한다고 가정하겠습니다.
x의 첫 번째 차원과cb의 첫 번째 차원은 최대3까지의 크기를 가질 수 있습니다.x의 두 번째 차원은 고정이며 값1을 갖습니다.cb의 두 번째 차원은 최대216까지의 크기를 가질 수 있습니다.
이러한 입력값 속성을 지정하려면 다음을 수행합니다.
진입점 탭에서 입력 유형을 자동으로 정의 아래에 테스트 파일
euclidean_test.m을 입력하고 실행 버튼을 클릭합니다. 테스트 파일이 예상되는 입력 유형을 사용하여 진입점 함수euclidean을 호출합니다. 앱은 입력값x는double 3 x 1이고 입력값cb는double 3 x 216이라고 확인합니다. 이러한 유형은 고정 크기 입력값을 지정합니다.euclidean함수 섹션의 세 번째 열에서 크기 사양을 클릭합니다. 입력값의 크기를 편집하는 데 사용할 수 있는 드롭다운 메뉴가 열립니다.:접두사를 사용하여 지정한 최대 제한까지 허용되는 가변 크기를 지정할 수 있습니다. 예를 들어,:3은 상응하는 차원의 크기가 최대3일 수 있음을 나타냅니다.x의 유형을double :3 x 1로 변경하고cb의 유형을double :3 x :216으로 변경합니다.

이전과 동일한 단계에 따라 코드를 생성합니다. 이제 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++ 코드 생성
- 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)