Main Content

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

이 행렬의 데이터는 다음과 같이 저장됩니다.

Data layout is h f p o l o u o r s o c e r h.

행렬이 N차원인 경우 MATLAB은 N 우선(N-major) 순서로 데이터를 나타냅니다. 예를 들어, 4×2×3 차원을 갖는 3차원 배열이 있다고 가정하겠습니다. 이때 데이터를 다음과 같이 시각화할 수 있지만,

Letters of alphabet arranged on three data pages A-H, I-P, and Q-X.

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(허수 데이터에 대한 포인터)라고 합니다. 비복소수 행렬은 piNULL입니다. 비복소수 행렬인지 테스트하려면 mxIsComplex를 호출하십시오.

기타 숫자형 행렬

MATLAB은 단정밀도 부동소수점과 8비트, 16비트, 32비트 및 64비트 정수(부호 있는 정수와 부호 없는 정수 모두)를 지원합니다.

논리형 행렬

논리 데이터형은 각각 숫자 10을 사용하여 논리형 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인 배열입니다. 예를 들어, mn이 0이고 paNULL인, double형의 배정밀도 mxArray는 빈 배열입니다.

희소 행렬

MATLAB에서 희소 행렬은 비희소 행렬과 다른 저장 규칙을 갖습니다. 파라미터 pa는 여전히 배정밀도 숫자 또는 논리값으로 구성된 배열이지만, 이 배열은 0이 아닌 데이터 요소만 포함합니다.

또한 세 개의 추가 파라미터 nzmax, irjc가 있습니다. 이러한 파라미터에 대한 변수를 선언할 때는 mwSize 유형과 mwIndex 유형을 사용하십시오.

  • nzmaxirpa의 길이를 포함하는 정수입니다. 이는 희소 행렬에 있는 0이 아닌 요소의 최대 개수입니다.

  • irpa의 대응하는 요소의 행 인덱스를 포함하는, 길이가 nzmax인 정수형 배열을 가리킵니다.

  • jc는 길이가 n+1인 정수형 배열을 가리킵니다. 여기서 n은 희소 행렬의 열 개수입니다. C에서 mxArray의 첫 번째 요소는 인덱스가 0입니다. jc 배열은 열 인덱스 정보를 포함합니다. 희소 행렬의 j번째 열에 0이 아닌 요소가 있는 경우, jc[j]j번째 열의 첫 번째 0이 아닌 요소의 irpa에 대한 인덱스입니다. 인덱스 jc[j+1] - 1에는 해당 열에서 마지막 0이 아닌 요소가 포함됩니다. 희소 행렬의 j번째 열에 대해, jc[j]는 이전의 모든 열에 있는 0이 아닌 요소의 총 개수입니다. jc 배열의 마지막 요소인 jc[n]은 전체 희소 행렬에 있는 0이 아닌 요소의 개수인 nnz와 같습니다. nnznzmax보다 작은 경우 저장공간을 더 할당하지 않고 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, mxCreateCellArraymxCreateCharArray가 있습니다. 예를 들어, 다음 명령문은 0으로 초기화된 m×1 부동소수점 mxArray를 할당합니다.

myData = mxCreateDoubleMatrix(m, 1, mxREAL);

C/C++ 프로그래머는 MATLAB 배열의 데이터가 열 우선 순서로 되어 있다는 점에 유의해야 합니다. 이에 대한 도해를 보려면 데이터 저장 항목을 참조하십시오. mxArray의 데이터를 읽어오려면 MATLAB mxGet* 배열 액세스 루틴을 사용하십시오.

데이터 조작하기

mxGet* 배열 액세스 루틴은 mxArray의 데이터에 대한 참조를 가져옵니다. MEX 파일의 데이터를 수정하려면 이러한 루틴을 사용하십시오. 각 함수는 mxArray에 있는 특정 정보에 대한 액세스를 제공합니다. 몇 가지 유용한 함수로는 mxGetDoubles, mxGetComplexDoubles, mxGetMmxGetString이 있습니다. 이러한 함수 대부분은 대응하는 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))

관련 항목