MATLAB 데이터
MATLAB 배열
MATLAB® 언어는 단일 객체 유형, 즉 MATLAB 배열을 사용하여 동작합니다. 모든 MATLAB 변수(스칼라, 벡터, 행렬, 문자형 배열, 셀형 배열, 구조체 및 객체 포함)는 MATLAB 배열로 저장됩니다. C/C++에서 MATLAB 배열은 mxArray
유형으로 선언됩니다. mxArray
구조체는 배열에 대한 다음과 같은 정보를 포함합니다.
배열의 유형
배열의 차원
이 배열과 연결된 데이터
숫자형 배열인 경우, 변수가 실수인지 복소수인지 여부
희소 배열인 경우, 배열의 인덱스와 0이 아닌 최대 요소
구조체형 배열 또는 객체 배열인 경우, 필드 개수와 필드 이름
mxArray
구조체에 액세스하려면 C 또는 Fortran Matrix API의 함수를 사용하십시오. 이러한 함수를 사용하면 MEX 파일에 MATLAB 데이터에 대한 정보를 만들고 읽고 쿼리할 수 있습니다. Matrix API는 mwSize
유형과 mwIndex
유형을 사용하여 이식성 문제를 방지하고 MEX 소스 파일이 모든 시스템에서 올바르게 컴파일될 수 있도록 합니다.
mxArray의 라이프사이클
MATLAB 함수와 마찬가지로, MEX 파일 게이트웨이 루틴은 MATLAB 변수를 참조 방식으로 전달합니다. 그러나 이러한 인수는 C 포인터입니다. 변수에 대한 포인터는 변수의 주소(메모리에서의 위치)입니다. MATLAB 함수는 데이터 저장을 자동으로 처리합니다. 데이터를 MEX 파일에 전달할 경우 포인터를 사용하는데, 포인터는 변수에 액세스하고 조작하는 것에 대한 특정 규칙을 따르게 됩니다. 포인터 사용에 대한 자세한 내용은 The C Programming Language(저자: Kernighan, B. W., D. M. Ritchie) 등의 프로그래밍 참고 문헌을 참조하십시오.
참고
변수는 메모리를 사용하므로, MEX 파일이 mxArray
를 만드는 방법과 메모리 해제(비우기)에 대한 사용자의 책임을 잘 알고 있어야 합니다. 이는 메모리 누수 방지를 위해 중요합니다. mxArray
의 라이프사이클과 메모리 관리에 관한 규칙은 mxArray가 입력 인수인지, 출력 인수인지 또는 지역 변수인지에 따라 다릅니다. mxArray
할당을 해제하기 위해 호출하는 함수는 mxArray를 만드는 데 사용했던 함수에 따라 다릅니다. 자세한 내용은 C Matrix API에서 배열을 생성할 수 있는 함수를 찾아보십시오.
입력 인수 prhs
prhs
입력 파라미터를 통해 MEX 파일에 전달된 mxArray
는 MEX 파일의 범위 밖에 있습니다. prhs
파라미터에서 어떤 mxArray
에 대한 메모리도 비우지 마십시오. 또한, prhs
변수는 읽기 전용이므로 MEX 파일에서 이 변수를 수정하지 마십시오.
출력 인수 plhs
출력 인수에 대한 mxArray
를 만드는 경우(즉, 메모리를 할당하고 데이터를 생성하는 경우) 메모리와 데이터는 MEX 파일의 범위 밖에 있습니다. plhs
출력 파라미터에 반환된 mxArray
에 대한 메모리를 비우지 마십시오.
지역 변수
mxCreate*
함수를 사용하여 mxArray
를 만들 때마다 또는 mxCalloc
함수와 관련 함수를 호출할 때 메모리가 할당됩니다. 입력 인수와 출력 인수 처리에 관한 규칙을 숙지한 후, MEX 파일은 임시 배열을 삭제하고 동적으로 할당된 메모리를 비울 것입니다. 메모리 할당을 해제하려면 mxDestroyArray
또는 mxFree
를 사용하십시오. 어떤 함수를 사용할지에 대한 자세한 내용은 MX 행렬 라이브러리를 참조하십시오.
데이터 저장
MATLAB은 Fortran이 행렬을 저장하는 방법인 열 우선(열 방향) 번호 매기기 방식으로 데이터를 저장합니다. MATLAB은 원래 Fortran으로 작성되었으므로 이 규칙을 사용합니다. MATLAB은 내부적으로 첫 번째 열의 데이터 요소를 먼저 저장한 다음, 두 번째 열의 데이터 요소를 두 번째로 저장하는 식으로 마지막 열까지 진행합니다.
다음 행렬을 예로 들어 보겠습니다.
a = ['house'; 'floor'; 'porch']
a = house floor porch
이 행렬의 차원은 다음과 같습니다.
size(a)
ans = 3 5
이 행렬의 데이터는 다음과 같이 저장됩니다.
행렬이 N차원인 경우 MATLAB은 N 우선(N-major) 순서로 데이터를 나타냅니다. 예를 들어, 4
×2
×3
차원을 갖는 3차원 배열이 있다고 가정하겠습니다. 이때 데이터를 다음과 같이 시각화할 수 있지만,
MATLAB은 내부적으로 이 3차원 배열의 데이터를 다음과 같은 순서로 나타냅니다.
A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 |
mxCalcSingleSubscript
함수는 N차원 첨자를 사용하여 배열의 첫 번째 요소부터 원하는 요소까지 오프셋을 만듭니다.
MATLAB 데이터형
복소수 배정밀도 행렬
MATLAB의 가장 일반적인 데이터형은 비희소 형식의 복소수 배정밀도 행렬입니다. 이러한 행렬은 double
형으로, m
×n
차원을 가집니다. 여기서 m
은 행 개수이고 n
은 열 개수입니다. 데이터는 배정밀도 숫자로 구성된 실수부/허수부 결합형 벡터로 저장됩니다. 이때 실수부와 허수부는 서로 이웃해 저장됩니다. 이 데이터에 대한 포인터를 pa
(배열에 대한 포인터)라고 합니다. 비복소수 행렬인지 테스트하려면 mxIsComplex
를 호출하십시오.
MATLAB 버전 9.4(R2018a) 이전에는 MATLAB은 실수부와 허수부를 분리해 저장했습니다. 즉, 데이터가 배정밀도 숫자로 구성된 두 개의 벡터로 저장되며, 이 중 한 벡터는 실수 데이터를 포함하고 다른 벡터는 허수 데이터를 포함합니다. 이 데이터에 대한 포인터를 각각 pr
(실수 데이터에 대한 포인터)과 pi
(허수 데이터에 대한 포인터)라고 합니다. 비복소수 행렬은 pi
가 NULL
입니다. 비복소수 행렬인지 테스트하려면 mxIsComplex
를 호출하십시오.
기타 숫자형 행렬
MATLAB은 단정밀도 부동소수점과 8비트, 16비트, 32비트 및 64비트 정수(부호 있는 정수와 부호 없는 정수 모두)를 지원합니다.
논리형 행렬
논리 데이터형은 각각 숫자 1
과 0
을 사용하여 논리형 true
또는 false
상태를 나타냅니다. 일부 MATLAB 함수와 연산자는 논리값 1
또는 논리값 0
을 반환하여 특정 조건이 참인지 여부를 나타냅니다. 예를 들어, 명령문 (5 * 10) > 40
은 논리값 1
을 반환합니다.
MATLAB char
배열
MATLAB char
배열은 데이터를 부호 없는 16비트 정수로 저장합니다. MATLAB char
배열을 C 스타일 문자열로 변환하려면 mxArrayToString
함수를 호출하십시오. C 스타일 문자열을 char
배열로 변환하려면 mxCreateString
함수를 호출하십시오.
셀형 배열
셀형 배열은 MATLAB 배열의 모음으로, 여기서 각 mxArray
를 셀이라고 합니다. 셀형 배열을 사용하면 서로 다른 유형의 MATLAB 배열을 함께 저장할 수 있습니다. 셀형 배열은, 데이터 일부가 mxArrays
에 대한 포인터로 구성된 단일 벡터를 포함한다는 점을 제외하고 숫자형 행렬과 비슷한 방식으로 저장됩니다. 이 벡터의 멤버를 셀이라고 합니다. 각 셀은 지원되는 어떤 데이터형이든 될 수 있으며, 또 하나의 셀형 배열일 수도 있습니다.
구조체
1
×1
구조체는 1
×n
셀형 배열과 같은 방식으로 저장됩니다. 여기서 n
은 구조체의 필드 개수입니다. 데이터 벡터의 멤버를 필드라고 합니다. 각 필드는 mxArray
에 저장된 이름과 연결되어 있습니다.
객체
객체는 구조체와 같은 방식으로 저장되고 액세스됩니다. MATLAB 내에서, 객체는 등록된 메서드를 가진 명명된 구조체입니다. MATLAB 밖에서, 객체는 객체의 이름을 식별하는 추가 클래스 이름에 대한 저장공간이 포함된 구조체입니다.
다차원 배열
모든 유형의 MATLAB 배열은 다차원 배열이 될 수 있습니다. 각 차원의 크기를 나타내는 정수 요소가 벡터에 저장됩니다. 데이터 저장 방법은 행렬과 동일합니다.
빈 배열
모든 유형의 MATLAB 배열은 빈 배열이 될 수 있습니다. 빈 mxArray
는 적어도 하나의 차원이 0인 배열입니다. 예를 들어, m
과 n
이 0이고 pa
가 NULL
인, double
형의 배정밀도 mxArray
는 빈 배열입니다.
희소 행렬
MATLAB에서 희소 행렬은 비희소 행렬과 다른 저장 규칙을 갖습니다. 파라미터 pa
는 여전히 배정밀도 숫자 또는 논리값으로 구성된 배열이지만, 이 배열은 0이 아닌 데이터 요소만 포함합니다.
또한 세 개의 추가 파라미터 nzmax
, ir
및 jc
가 있습니다. 이러한 파라미터에 대한 변수를 선언할 때는 mwSize
유형과 mwIndex
유형을 사용하십시오.
nzmax
는ir
과pa
의 길이를 포함하는 정수입니다. 이는 희소 행렬에 있는 0이 아닌 요소의 최대 개수입니다.ir
은pa
의 대응하는 요소의 행 인덱스를 포함하는, 길이가nzmax
인 정수형 배열을 가리킵니다.jc
는 길이가n+1
인 정수형 배열을 가리킵니다. 여기서n
은 희소 행렬의 열 개수입니다. C에서mxArray
의 첫 번째 요소는 인덱스가 0입니다.jc
배열은 열 인덱스 정보를 포함합니다. 희소 행렬의j
번째 열에 0이 아닌 요소가 있는 경우,jc[j]
는j
번째 열의 첫 번째 0이 아닌 요소의ir
과pa
에 대한 인덱스입니다. 인덱스jc[j+1] - 1
에는 해당 열에서 마지막 0이 아닌 요소가 포함됩니다. 희소 행렬의j
번째 열에 대해,jc[j]
는 이전의 모든 열에 있는 0이 아닌 요소의 총 개수입니다.jc
배열의 마지막 요소인jc[n]
은 전체 희소 행렬에 있는 0이 아닌 요소의 개수인nnz
와 같습니다.nnz
가nzmax
보다 작은 경우 저장공간을 더 할당하지 않고 0이 아닌 항목을 배열에 더 삽입할 수 있습니다.
데이터형 사용하기
MATLAB에서 지원하는 모든 클래스 유형이나 데이터형을 허용하는 소스 MEX 파일, MAT 파일 응용 프로그램 및 엔진 응용 프로그램을 C/C++로 작성할 수 있습니다(데이터형 참조). Fortran에서는 배정밀도 n
×m
배열과 문자열 생성만 지원됩니다. 이진 C/C++ 및 Fortran MEX 파일을 MATLAB 함수처럼 사용할 수 있습니다.
주의
행렬 라이브러리 생성 함수 중 하나(예: mxCreateStructArray
)를 사용하여 C/C++ 또는 Fortran에서 만든 MATLAB 데이터 구조체는 MATLAB이 그 유효성을 확인하지 않습니다. 유효하지 않은 구문을 사용하여 MATLAB 데이터 구조체를 만들면 C/C++ 또는 Fortran 프로그램에서 예기치 않은 동작이 발생할 수 있습니다.
데이터 구조체 선언하기
MATLAB 배열을 처리하려면 mxArray
유형을 사용하십시오. 다음 명령문은 myData
라는 mxArray
를 선언합니다.
mxArray *myData;
myData
의 값을 정의하려면 mxCreate*
함수 중 하나를 사용하십시오. 몇 가지 유용한 배열 생성 루틴으로는 mxCreateNumericArray
, mxCreateCellArray
및 mxCreateCharArray
가 있습니다. 예를 들어, 다음 명령문은 0
으로 초기화된 m
×1
부동소수점 mxArray
를 할당합니다.
myData = mxCreateDoubleMatrix(m, 1, mxREAL);
C/C++ 프로그래머는 MATLAB 배열의 데이터가 열 우선 순서로 되어 있다는 점에 유의해야 합니다. 이에 대한 도해를 보려면 데이터 저장 항목을 참조하십시오. mxArray
의 데이터를 읽어오려면 MATLAB mxGet*
배열 액세스 루틴을 사용하십시오.
데이터 조작하기
mxGet*
배열 액세스 루틴은 mxArray
의 데이터에 대한 참조를 가져옵니다. MEX 파일의 데이터를 수정하려면 이러한 루틴을 사용하십시오. 각 함수는 mxArray
에 있는 특정 정보에 대한 액세스를 제공합니다. 몇 가지 유용한 함수로는 mxGetDoubles
, mxGetComplexDoubles
, mxGetM
및 mxGetString
이 있습니다. 이러한 함수 대부분은 대응하는 mxSet*
루틴을 가지므로, 배열의 값을 수정할 수 있습니다.
다음 명령문은 입력값 prhs[0]
을 C 스타일 문자열 buf
로 읽어 들입니다.
char *buf; int buflen; int status; buflen = mxGetN(prhs[0])*sizeof(mxChar)+1; buf = mxMalloc(buflen); status = mxGetString(prhs[0], buf, buflen);
explore
예제
MATLAB에는 입력 변수의 데이터형을 식별하는 explore.c
라는 예제 소스 MEX 파일이 포함되어 있습니다. 이 예제의 소스 코드는 matlabroot
/extern/examples/mex
에 있습니다. 여기서 matlabroot
는 시스템에서 MATLAB이 설치된 위치의 최상위 폴더를 나타냅니다.
참고
이 문서에서 플랫폼에 독립적으로 폴더 경로를 언급할 때는 UNIX® 규칙을 사용합니다. 예를 들어, 일반적으로 mex
폴더를 지칭할 경우 이는 matlabroot
/extern/examples/mex
를 의미합니다.
예제 MEX 파일을 빌드하려면 먼저 파일을 사용자 시스템 경로의 쓰기 가능한 폴더로 복사하십시오.
copyfile(fullfile(matlabroot,'extern','examples','mex','explore.c'),'.','f')
mex
명령을 사용하여 MEX 파일을 빌드하십시오.
mex explore.c -R2018a
다음을 입력합니다.
x = 2; explore(x)
------------------------------------------------ Name: prhs[0] Dimensions: 1x1 Class Name: double ------------------------------------------------ (1,1) = 2
explore
는 모든 데이터형을 인수로 받습니다. 다음 예제와 같이 explore
를 사용해 보십시오.
explore([1 2 3 4 5]) explore 1 2 3 4 5 explore({1 2 3 4 5}) explore(int8([1 2 3 4 5])) explore {1 2 3 4 5} explore(sparse(eye(5))) explore(struct('name', 'Joe Jones', 'ext', 7332)) explore(1, 2, 3, 4, 5) explore(complex(3,4))