SturdyCobble's Study Note

[MATLAB] 07. 다차원 배열 본문

프로그래밍/MATLAB

[MATLAB] 07. 다차원 배열

StudyingCobble 2019. 8. 26. 16:29

NOTICE : 독학인 만큼, 잘못된 내용이 있을 수 있습니다. 내용 지적은 언제나 환영합니다.

더 이상 이 블로그에는 글을 올리지는 않을 예정입니다. 그렇지만 댓글을 달아주시면 최대한 답변드리고자 노력하겠습니다.


※ 이 글은 최소한 Python과 같은 프로그래밍 언어를 한 번 이상 접한 사람을 독자로 가정하여 작성되었습니다. 사용버전은 R2019a기준입니다. 또한 기본적인 프로그램 조작보다는 프로그래밍에 초점을 맞추어 작성하였습니다.


가끔은 2차원의 배열 즉, 일반적인 행렬 이상의 배열에 접근해야 할 때가 있습니다. 이때, 다차원 배열을 이용합니다. 행렬과 같이 zeros, ones, rand, randn을 통해 생성 가능합니다.

 

>> A = ones(3,4,5)

A(:,:,1) =

     1     1     1     1
     1     1     1     1
     1     1     1     1


A(:,:,2) =

     1     1     1     1
     1     1     1     1
     1     1     1     1


A(:,:,3) =

     1     1     1     1
     1     1     1     1
     1     1     1     1


A(:,:,4) =

     1     1     1     1
     1     1     1     1
     1     1     1     1


A(:,:,5) =

     1     1     1     1
     1     1     1     1
     1     1     1     1

 

이러한 다차원 배열을 통해 3차원 이상의 정보를 표시해볼 수도 있습니다. 

 

sum이나 all, any 등의 함수는 마지막 인수로 차원을 받을 수 있습니다. 이 경우 해당 차원에 대해서 계산을 진행합니다. 아래와 같이 작성해볼 수 있습니다.

%코드
A = randn(2,2,2);
disp("열 마다 계산")
sum(A) % sum(A,1)과 동일
disp("행 마다 계산")
sum(A,2)
disp("3번째 축으로 합산")
sum(A,3)

---------------------------실행 결과---------------------------

열 마다 계산

ans(:,:,1) =
    6.3478    1.6850

ans(:,:,2) =
    0.6623    0.5098

행 마다 계산

ans(:,:,1) =
    2.2285
    5.8044

ans(:,:,2) =
    1.4401
   -0.2680

3번째 축으로 합산

ans =
    4.3038   -0.6351
    2.7064    2.8300

 

그림으로 나타내면, sum(A,3)을 다음과 같이 이해할 수 있습니다.

 

MATLAB에는 셀(Cell)형 배열도 존재합니다. 이는 크기가 다른 여러 배열의 복사본을 원소로 가질 수 있습니다. cell함수를 이용하거나 중괄호로 선언하며, 중괄호로 특정 원소에 접근합니다.

 

%코드
A = randn(2,2,2);
B = { A sum(A) ; sum(sum(sum(A),2),3) prod(A(:,:,1))}
C = cell(2,2,2)

---------- 실행 결과 -----------------

B =
  2×2 cell 배열

    {2×2×2 double}    {1×2×2 double}
    {[   -2.7785]}    {1×2   double}

  2×2×2 cell 배열
C(:,:,1) = 
    {0×0 double}    {0×0 double}
    {0×0 double}    {0×0 double}

C(:,:,2) = 
    {0×0 double}    {0×0 double}
    {0×0 double}    {0×0 double}

 

MATLAB에는 C/C++에도 존재하는 구조체라는 문법이 있습니다. 사용 방법은 간단합니다.

 

S.name = 'James';
S.id = 'James101';
disp(S)
U = struct('name','peter','major','computer science'}

-------------실행 결과---------------
    name: 'James'
      id: 'James101'


U = 

  다음 필드를 포함한 struct:

     name: 'peter'
    major: 'computer science'

 

 

이렇게 다양한 속성 들을 추가할 수 있습니다. 이렇게 함으로서 비슷한 형태의 여러 데이터를 한 번에 처리할 수 있습니다. 예를 들어 3명의 성적 정보를 다룬다고 해봅시다.

 

S.name = 'James';
S.score = 100;

S(2).name = 'Mike';
S(3).name = 'Peter';

S(2).score = 78;
S(3).score = 12;

S
[S.score]
[S.name]
char(S.name)
{S.name}

---------------실행 결과(개행은 임의로 변경하였음)------------------------------
S = 
  다음 필드를 포함한 1×3 struct 배열:
    name
    score

ans =
   100    78    12

ans =
    'JamesMikePeter'

ans =
  3×5 char 배열
    'James'
    'Mike '
    'Peter'

ans =
  1×3 cell 배열
    {'James'}    {'Mike'}    {'Peter'}

 

만약 성적 처리를 해야한다면, 필드 명을 동적으로 활용할 수 있어야 합니다. 이는 .( 변수 )와 같은 형식으로 가능해집니다.

 

ExamScore.Mike = struct('score',[10,7,6,8,9,10]);
ExamScore.James = struct('score',[10,10,4,8,9,10]);

name = 'James';
scList = ExamScore.(name).score;
sizeList = size(scList);
sum(scList,2) / sizeList(2)

------------실행 결과-----------------
ans =

    8.5000

 

 

Comments