본문 바로가기
programming language/MATLAB

MATLAB cell class

by __observer__ 2011. 4. 11.
반응형

 

MATLAB 에는 약간 독특한 cell 이라는 class 가 존재 합니다.

 

cell class 는 타입을 안 가리고 다 저장 하거든요.

 

숫자 문자를 가리지 않고 하나의 변수로 관리 할 수 있습니다.

 

struct class 처럼 field 로 구분하는 것도 아닌 게 한 변수에 막 집어 넣으니깐 처음에는 참 신기하더군요.

 

perl 을 접하신 분은 '당연한 거 아냐?' 하실 지도 …..

 

아무튼 이 cell 타입이라는 게 나중에는 참 쓸모가 많아 지니깐, 알아 두시면 도움이 됩니다.

 

아!! 여담으로 MATLAB 에서 perl script 도 실행이 가능 합니다.

 

MATLAB 에서 perl() 함수를 찾아 보시길~ 이런 것도 되? 하면서 좋아하실 분들도 있을 거라 생각 됩니다. 아닌가? ㅡㅡ;

   


 

cell class 의 변수를 설정 하는 방법은 다음과 같이 두 가지 방법이 있습니다.

 

  • 중괄호 {} 를 이용하는 방법

 

A={1:10, 'abc'; zeros(3), 'cell'}

A =

[1x10 double] 'abc'

[3x3 double] 'cell'

 

 

  • cell() 함수를 이용하는 방법

 

A=cell(2)

A=cell(2,2)

A =

[] []

[] []

 

위 명령들은 A 를 2행 2열의 empty cell로 만들어 줍니다.



 

cell A 의 각 인자에 값을 넣을때는 다음과 같이 표현 합니다.

 

A{1, 2}='1 row 2 column'

A =

[] '1 row 2 column'

[] []

 

 

위 코드는 A 의 1 행 2열에 문자열을 입력한 경우 입니다. matrix 에서는 각 인자의 값에 접근 할 때 ()괄호를 이용하였지만, cell class 에서는 중괄호를 이용한다는데 주의 하셔야 합니다.

 

괄호를 이용하여 A 의 2행 2열에 값을 입력하고 싶을 때는 다음과 같이 표현해야 합니다.

 

A(2, 2)={1:10} % 등호 우측에 중괄호를 이용하여 cell 을 넣어줌

A =

[] '1 row 2 column'

[] [1x10 double]

 

괄호를 이용하여 다음과 같이 접근 해 보죠.

 

A={1:10, 'abc'; zeros(3), 'cell'}

A =

[1x10 double] 'abc'

[3x3 double] 'cell'

 

B=A(1,2) % A 의 1 행 2열 에 괄호를 이용

B =

'abc'

 

class(B)

ans =

cell

 

B 는 cell class 의 값 입니다.

 

즉 B = {'abc'} 라고 표현한 것과 같은 것입니다. 



 

cell 에는 어떤 타입이든 담을 수 있기 때문에 cell 안에 cell을 담을 수도 있습니다.

 

A={1:10, 'abc'; zeros(3), 'cell'}

A =

[1x10 double] 'abc'

[3x3 double] 'cell'

 

B=cell(2)

B =

[] []

[] []

 

B{1,1}=A % B 의 1행 1열에 cell A 를 입력

B =

{2x2 cell} []

[] []

 

B{2,2}=ones(3)

B =

{2x2 cell} []

[] [3x3 double]

 

 

cell 안에 어떤 내용이 담겨 있나 구체적으로 알고 싶을 때는 cellplot() 함수를 이용하면 시각적으로 볼 수 있습니다.

 

cellplot(B,'legend')

 

celldisp() 함수를 이용하면 단순히 command 창에 그 값들을 나열하게 됩니다.

 

celldisp(B)

B{1,1}{1,1} =

1 2 3 4 5 6 7 8 9 10

B{1,1}{2,1} =

0 0 0

0 0 0

0 0 0

B{1,1}{1,2} =

abc

B{1,1}{2,2} =

cell

B{2,1} =

[]

B{1,2} =

[]

B{2,2} =

1 1 1

1 1 1

1 1 1

 



 

cell B 의 1행 1열안의 2행 2열에 있는 cell 이라는 문자열에 접근 하기 위해서는 다음과 같이 표현 하면 됩니다.

 

B{1,1}{2,2}

ans =

cell

 

 

cell 이라는 문자열의 2번째 글자인 e 를 나타내려면 다음과 같이 입력하면 됩니다.

 

B{1,1}{2,2}(2)

ans =

e

 



 

이제 cell A,B 를 C 라는 cell 에 넣어 볼까요...

 

C={A, B}

C =

{2x2 cell} {2x2 cell}

 

size(C)

ans =

1 2

 

C는 1행 2열의 cell 이 됩니다.

 

C={A ; B}

C =

{2x2 cell}

{2x2 cell}

 

size(C)

ans =

2 1

 

이렇게 하니깐 C 가 2행 1열의 cell 이 되죠.

 



 

그럼 2행 2열의 cell A와 2행 2열의 cell B 를 붙여서 4 행 2열을 만들고 싶으면 어떻게 해야 될까요.

 

이럴 때는 대괄호를 이용합니다.

 

D=[A B]

D =

[1x10 double] 'abc' {2x2 cell} []

[3x3 double] 'cell' [] [3x3 double]

 

D=[A ; B]

D =

[1x10 double] 'abc'

[3x3 double] 'cell'

{2x2 cell } []

[] [3x3 double]

 



 

: 콜론을 이용하여 cell D 에 다음과 같이 값을 할당 해 보죠.

 

D(:,1)={1, 2, 3, 4}

D =

[1] 'abc'

[2] 'cell'

[3] []

[4] [3x3 double]

 

위와 같은 표현은 구버전의 MATLAB 을 이용하시는 분들은 실행이 안 될 수 있습니다.

 

그럴 때는 deal() 함수를 이용하시면 됩니다.

 

[D{:,1}]=deal(1,2,3,4)

D =

[1] 'abc'

[2] 'cell'

[3] []

[4] [3x3 double]

 



 

콜론을 이용하여 cell 의 값을 반환하는 예를 보죠.

 

f=D{:,1}

f =

1

 

위 코드는 이상하게도 1 만 나오죠?

 

1, 2, 3, 4를 벡터로 나타낼 때는 다음과 같이 합니다.

 

f=cell2mat(D(:,1))

f =

1

2

3

4

 

cell2mat() 함수는 cell class 를 matrix 로 만들어 줍니다.

 

matrix 를 cell 로 만들어 줄 때는 mat2cell() 이라는 함수를 이용합니다.

 

A=magic(2)

A =

1 3

4 2

 

G=mat2cell(A,2,2)

G =

[2x2 double]

 

celldisp(G)

G{1} =

1 3

4 2

 

size(G)

ans =

1 1

 

위 결과를 보면 G 의 크기가 1행 1열이죠? 2 행 2열로 나타내고 싶은데 말이죠..

 

다음과 같이 하면 원하는 결과를 얻을 수 있습니다.

 

G2=mat2cell(A,[1 1],[1 1])

G2 =

[1] [3]

[4] [2]

 

size(G2)

ans =

2 2

 

숫자만으로 구성된 matrix 를 cell 로 표현 할 때는 num2cell() 함수를 사용하는 게 좀 더 편리 합니다.

 

G3=num2cell(A)

G3 =

[1] [3]

[4] [2]

 

size(G3)

ans =

2 2



반응형

댓글