SturdyCobble's Study Note

[MATLAB] 03. 행렬 인덱싱과 문자열 본문

프로그래밍/MATLAB

[MATLAB] 03. 행렬 인덱싱과 문자열

StudyingCobble 2019. 8. 4. 14:52

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

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


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

인덱싱은 배열 또는 행렬의 특정 요소나 특정 요소들에 접근하는 것이라고 할 수 있습니다.

 

먼저, 어떤 한 요소에 접근하는 방법입니다. 다른 언어의 배열이나 이중 리스트와 비슷하게 접근할 수 있습니다. 다만, 좌표계와 비슷하게 접근하는 모습을 보입니다.

 

P = rand(3,3);
P(1,1)
P = rand(3,3,3);
P(1,2,3)

 

첫번째 출력 결과는 1행 1열의 요소일 것입니다. 두번째 출력의 경우 3차원 배열에서 인덱스가 [1][2][3]인 요소를 나타냅니다. 여기서 다른 언어와 차이가 나는 점이 또 있다면, 인덱스가 1부터 시작하는 것입니다. 이는 수학적으로는 1행 1열부터 시작하기에 당연하지만, 0부터 시작하는 타 언어를 사용하다보면 헷갈리기 쉬운 지점이기도 합니다.

 

Python과는 달리 음수 인덱싱은 불가능하기에 end를 써서 다음과 같이 끝 요소나 그 근처를 참조할 수 있습니다.

P = rand(3,3);
P(end,end-2)

 

 

또한, 선형 인덱싱이라고 해서 다음과 같이 참조하는 방법도 있습니다.

MATLAB의 선형 인덱싱을 도식화한 그림

선형 첨자와 일반 첨자의 변환은 ind2sub, sub2ind함수로 가능합니다.

 

ind2sub(크기, 선형 첨자)
sub2ind(크기, 첨자1, 첨자2, ...)

 

아래와 같은 예시가 가능합니다.

 

P = [1 2 3; 4 5 6; 7 8 9]
[r, c] = ind2sub([3,3],3)
ind = sub2ind(size(P),1,2)

 

MATLAB의 특징 중 하나는 범위 밖의 요소를 참조할 수는 없지만, 대입은 할 수 있습니다. 이 경우 자동으로 행렬이 확장됩니다.

 

P = [1 2; 3 4]
P(1,3)=4;
P

 

출력 결과는 다음과 같습니다.

 

P =

     1     2
     3     4


P =

     1     2     4
     3     4     0

 

MATLAB은 공학적 용도로 많이 사용되기에 행벡터나 열벡터를 가져오는 일도 중요할 것입니다. 이는 콜론(:)을 사용하여 다음과 같이 나타낼 수 있습니다.

 

P = [1 2 3; 4 5 6; 7 8 9]
P(2,:)
P(:,3)

 

출력 결과는 다음과 같습니다.

 

P =

     1     2     3
     4     5     6
     7     8     9


ans =

     4     5     6


ans =

     3
     6
     9

 

만약 한 열이나 행의 일부만 가져오거나, 행렬의 일부만을 가져온다면 다음과 같이 행벡터 2개를 이용하면 됩니다.

 

a = [ 1 2 3 4
      6 7 8 9
      10 11 12 13
      14 15 16 17 ];
a([2 4],[1 2 4])

------------------결과------------------
ans =

     6     7     9
    14    15    17

 

만약 연속된 경우, start:end 와 같이 지정할 수 있습니다. 이 경우 처음과 끝이 모두 포함되는 점이 Python과 다릅니다.

 

P = [1 0 0; 0 5 6; 0 8 9]
P(2:3,2:3)
P(2:3,2)

 

아래는 출력 결과입니다.

 

P =

     1     0     0
     0     5     6
     0     8     9


ans =

     5     6
     8     9


ans =

     5
     8

 

step을 지정하여, start:step:end의 형식으로 사용하는 것도 가능합니다. Python처럼 음수를 step으로 가지는 것도 가능합니다.

 

P = [1 0 1; 2 0 2; 3 0 3]
P(3:-1:1,1:2:3)

 

아래는 출력 결과입니다.

 

P =

     1     0     1
     2     0     2
     3     0     3


ans =

     3     3
     2     2
     1     1

 

이와 같은 표현 방식은 행렬을 생성하는 데에도 이용될 수 있습니다.

[1:2:10]
---------출력------------
ans =

     1     3     5     7     9

이러한 방식으로 다음과 같이 표(table)을 만드는 것도 가능합니다.

 

num = [0:0.1:1]'; % 열벡터 생성
[num num.^2 num.^3] % 테이블 생성
-------------출력 결과--------------
ans =

         0         0         0
    0.1000    0.0100    0.0010
    0.2000    0.0400    0.0080
    0.3000    0.0900    0.0270
    0.4000    0.1600    0.0640
    0.5000    0.2500    0.1250
    0.6000    0.3600    0.2160
    0.7000    0.4900    0.3430
    0.8000    0.6400    0.5120
    0.9000    0.8100    0.7290
    1.0000    1.0000    1.0000

 

행과 열을 삭제하기 위해서는 다음과 같이 할 수 있습니다.

 

A = rand(3,3)
A(1,:) = []
---------출력----------
A =

    0.4505    0.9133    0.5383
    0.0838    0.1524    0.9961
    0.2290    0.8258    0.0782


A =

    0.0838    0.1524    0.9961
    0.2290    0.8258    0.0782

 

 

다음은 문자열에 대해 다뤄보겠습니다. 이 역시 배열로서 저장되며, 1×N 배열로 생각할 수 있습니다. 

 

일단 문자열은 따옴표로 ("또는') 둘러싸여야 하며, 그 안에 겉을 둘러싼 따옴표와 같은 따옴표가 있다면 두번 써서 다음과 같이 표현합니다.

 

str1 = "Hello"
str2 ='I''m groot'

 

다만, 작은 따옴표는 문자형 배열로, 큰 따옴표는 string형 배열로 다음과 같은 차이가 있습니다.

 

str1 = "Hello";
str2 ="I'm groot";
str = [str1,", ",str2]
str1 = 'Hello';
str2 ='I''m groot';
str = [str1,', ',str2]

 

출력 결과는 다음과 같습니다.

 

str =
  1×3 string 배열

    "Hello"    ", "    "I'm groot"


str =

    'Hello, I'm groot'

 

참고로 두 자료형이 같이 있으면, string으로 캐스팅되는 것같습니다.

 

또한, 문자형 배열로는 다음과 같이 배열을 만들 기 힘들다는 문제가 있습니다.

str1 = 'Hello';
str2 = 'Hellu';
str3 = 'Nice';
[str1;str2]
[str1;str3]
----------------------출력 결과------------
ans =

  2×5 char 배열

    'Hello'
    'Hellu'

다음 사용 중 오류가 발생함: vertcat
결합하려는 배열의 차원이 일치하지 않습니다.

오류 발생: TEST (line 5)
[str1;str3]

이는 string형에서는 문자열의 길이와 무관합니다.

str1 = "Hello";
str2 = "Hellu";
str3 = "Nice";
[str1;str2]
[str1;str3]
----------------------출력 결과------------
ans = 

  2×1 string 배열

    "Hello"
    "Hellu"


ans = 

  2×1 string 배열

    "Hello"
    "Nice"

 

다만 이런 차이가 있다보니 필요한 저장공간의 크기에도 차이가 있습니다.

 

% 파일명 : Test.m
str1 = "Hello";
str2 = 'Hellu';
-----------출력------------
>> Test
>> whos
  Name      Size            Bytes  Class     Attributes

  str1      1x1               158  string              
  str2      1x5                10  char                

아무래도 string형이 더 큰 사이즈를 필요로 합니다.

 

 

문자열의 길이는 다음과 같이 구합니다.

 

strlength(문자열)

 

또한, 문자열과 숫자 사이 변환은 다음 함수를 이용합니다.

 

num2str(숫자)
str2num(문자열)

 

 

 

 

 

 

Comments