자급자족하는 블로그

[MATLAB] 변수형(Data type) - 2 본문

MATLAB

[MATLAB] 변수형(Data type) - 2

YPSR 2018. 7. 19. 01:58

지난 포스팅에 이어서, 이번에는 cell, structure, function handles data type에 대해 소개하겠습니다.



1. Cell


지난 번 포스팅의 가장 첫 부분에서 언급했듯이, MATLAB의 모든 변수는 array의 형태로 표현됩니다.

하지만 array는 각 element의 data type과 memory size가 동일해야 합니다.

Array 선언 시 이를 고려하지 않으면 제대로 array가 생성되지 않거나, 생성되더라도 MATLAB에서 임의로 data type을 바꾸기 때문에 의도치 않은 정보 손실이 일어날 수 있습니다.


Fig 1. Examples for well-assigned case and unexpected wrong cases


Fig 1에서 보이는 arr1은 원하는 대로 잘 선언되었음을 확인할 수 있습니다.

arr2의 경우, numeric data type과 character data type을 혼용하였기 때문에 MATLAB에서 임의로 numeric data를 character data로 인식, 그에 맞는 유니코드 문자를 반환한 결과입니다.

arr3는 각 배열의 차원이 일치하지 않는다는 에러가 발생하였습니다. 지난 포스팅에서 말씀드렸듯이, 문자열(string)은 곧 character형 data의 array입니다. 이는 곧 row1과 row2의 차원 차이로 이어지며, array 생성이 불가능한 것이죠.

arr4의 경우, 모두 numeric data type 변수를 element로 선언했지만, memory size가 달라 MATLAB에서 임의로 size를 통일시켰습니다. 그 결과, double 또는 single로는 표현될 수 있었던 소수부가 손실된 것이죠.


반면, Cell은 data type, memory size와 무관하게 모든 data를 array와 유사한 형태로 저장할 수 있습니다.

(Array와 유사하다는 것은 곧 matrix 형태임을 말하며, 때문에 차원은 반드시 맞춰주어야함)

Array와는 달리 중괄호({ })를 이용하여 각 data를 묶어주며, 세미콜론(;)으로 row를 구분하여 선언합니다.

(Array는 대괄호([ ])를 사용하여 선언, row 구분은 마찬가지로 세미콜론(;) 사용)


Cell element를 참조하는 방식에는 두 가지가 있습니다. 소괄호(( ))를 사용하는 방식과 중괄호({ })를 사용하는 방식인데요,

소괄호를 이용하여 cell element를 참조할 경우, 참조한 cell element를 통째로 cell data type으로 반환합니다.

중괄호를 이용할 경우, 참조한 cell element를 기존에 선언했던 data type으로 반환합니다.


아래 Fig 2를 보시면 쉽게 이해하실 수 있을 것입니다.


Fig 2. Cell data type



2. Structure


각 data를 윈도우의 파일(file)이라고 생각했을 때, structure data type은 폴더(folder)의 역할을 합니다.

MATLAB에서는 file 대신 value, folder 대신 field라는 표현을 사용할 뿐, 그 기능에는 거의 차이가 없습니다.


Structure data type의 변수를 선언하는 데에는 크게 복잡할 것이 없습니다.

윈도우에서 folder 내의 folder 또는 file을 참조할 때 역대쉬()를 사용하듯이, MATLAB에서 structure data type은 하위 field 또는 value 참조 시 점(.)을 사용합니다.


Fig 3. Example for structure data assign


점을 이용하여 structure data를 생성한 그림입니다.

윈도우에서 기존의 folder를 새로 생성한 folder 내부로 옮길 수 있듯이, MATLAB의 structure data type 또한 기존의 field 또는 value를 새로이 다른 field 아래로 참조할 수 있습니다.


아래는 생성된 structure입니다.


  

Fig 4, 5. Assigned structure. The student field(left) is the upper filed of the Kim field(right).


보시면 윈도우의 folder 또는 file과 매우 유사한 구조임을 알 수 있습니다.

Structure data는 이렇게 점을 이용한 참조 방식으로 선언할 수도 있지만, struct 명령문을 이용해서도 선언할 수 있습니다.

아래는 동일한 field 및 value를 가지는 structure를 struct 명령문으로 assign한 그림입니다.


Fig 6. Structure data assign using a struct command


결과는 포스팅하지 않았지만, 실제로 해보시면 동일한 structure가 생성됨을 확인하실 수 있을 겁니다.

생성된 structure data의 field 또는 value를 확인하는 것 또한 점을 이용하시면 쉽게 값을 얻을 수 있습니다.


Fig 7. Reference of field or value of the structure


아래는 structure data type과 관련된 command 몇 가지입니다.


 s = struct('f1', v1, 'f2', v2, ...)

 value가 v1인 field f1, value가 v2인 field f2, ...를 하위 field로 가지는 structure s를 생성

 fieldnames(s)

 structure s의 모든 하위 field들의 이름을 반환

 getfield(s, 'f1')

 structure s의 하위 field인 f1의 value를 반환. s.f1과 동일

 isfield(s, 'f1')

 f1이 s의 하위 field이면 true, 아니면 false를 반환

 isstruct(s)

 s가 structure data type이면 true, 아니면 false를 반환

 setfield(s, 'f1', v1)

 s의 하위 field f1의 value를 v1으로 assign. s.f1=v1과 동일

 rmfield(s, 'f1')

 s의 하위 field f1을 삭제

Table 1. Commands for structure data type



3. Function handles


Function handle은 함수에 대한 연결을 저장하는 data type입니다. 이렇게 말하면 감이 잘 안오실 겁니다.

쉽게 말하자면, 함수를 변수로 취급하겠다는 것이죠.

Function handle을 선언하는 방법은 매우 간단합니다.

변수로 취급하고자 하는 함수 앞에 @을 붙이면 됩니다.


Fig 8. Examples for function handles


Fig 8과 같이 선언하면 fh1이라는 변수를 plot 함수처럼, fh2라는 변수를 sin 함수처럼 사용할 수 있습니다.

그렇다면 Fig 8의 가장 아래 command인 'figure, fh1(t, fh2(t))'는 무엇일까요?

바로, figure 창을 열고 t에 대하여 sin(t)를 plot하라는 명령입니다.

(Array t 생성에 대한 내용은 추후에 다룰 예정)

결과를 확인해보면 아래와 같습니다.


Fig 9. Result of the command in Fig 8


예상대로 사인 그래프가 출력됨을 확인할 수 있네요.

Function handle은 사용자가 직접 만든 함수에도 적용할 수 있습니다. 단, 사용하기 위해서는 사용자 생성 함수가 현재 디렉토리에 존재해야 합니다.


그렇다면 왜 굳이 함수를 두고 function handle이라는 data type을 새로 두었을까요?


Fig 10. User defined function to plot data a for 0 to 10 with 0.01 interval


Fig 10은 a라는 data를 0부터 10에 대해 출력하는 사용자 지정 함수입니다.

(Editor window를 이용한 스크립트 및 함수 작성은 추후에 다룰 예정)

여기서 아래와 같은 명령어를 Command window에 입력하면 어떻게 될까요?


>> example(@sin)

또는

>> example(@cos)


위 a의 자리에 sin 또는 cos 함수가 들어간다고 생각하시면 됩니다.

바로, 0부터 10까지 sin 또는 cos 값이 출력되어 그려질 것입니다.

이렇듯, function handle을 사용하면 함수를 변수로 취급하여 사용할 수 있게 됩니다.

이를 잘 이용한다면 추후 스크립트 또는 함수 작성 시에 보다 단조롭고 빠른 연산을 보일 수 있겠지요.




마지막으로, data type에 관한 command 몇 가지를 소개해드리면서 오늘 포스팅을 마무리하겠습니다.


 whos var

 var의 data type, memory size 등의 정보를 반환

 int8(var)

 var을 int8 class type의 변수로 변환

 int16(var)

 var을 int16 class type의 변수로 변환

 int32(var) 

 var을 int32 class type의 변수로 변환

 int64(var)

 var을 int64 class type의 변수로 변환

 uint8(var)

 var을 uint8 class type의 변수로 변환

 uint16(var)

 var을 uint16 class type의 변수로 변환

 uint32(var)

 var을 uint32 class type의 변수로 변환

 uint64(var)

 var을 uint64 class type의 변수로 변환

 single(var)

 var을 single class type의 변수로 변환

 double(var)

 var을 double class type의 변수로 변환

 char(var)

 var을 character type의 변수로 변환

 logical(var)

 var을 logical type의 변수로 변환

Table 2. Several commands for data types




다음 포스팅에서는 array 생성 및 관련 command에 관해서 소개해드리겠습니다.

감사합니다.







Comments