자급자족하는 블로그

[MATLAB] 배열 선언 및 참조(Creating and Indexing Arrays) 본문

MATLAB

[MATLAB] 배열 선언 및 참조(Creating and Indexing Arrays)

YPSR 2018. 7. 20. 01:32

이번 포스팅에서는 array를 생성하는 방법과 array 내의 element들을 참조하는 방법에 대해서 알아보도록 하겠습니다.


구체적인 방법론에 들어가기 앞서, array의 정의가 무엇인지 알 필요가 있을 것 같습니다.

본 교재에 의하면, MATLAB에서의 array란 수 또는 문자(결국 문자도 수로 표현)가 row 또는 column을 따라 열거된 목록입니다.


Data type 포스팅에서도 언급했듯, MATLAB에서 array는 data를 저장 및 조작하는 데에 사용하는 근본적인 구조입니다.

때문에 우리는 앞으로 다양한 변수를 자유롭게 다루고 처리하기 위해서는 array를 다루는 데에 능숙해져야 합니다.



그럼 이제 array를 선언(생성)하는 방법부터 알아보겠습니다.

가장 단순한 1D array, 즉 vector를 생성하는 것부터 시작합시다.


Vector에는 row vector와 column vector가 있습니다.

Row vector를 선언하기 위해서는 대괄호([ ]) 안에 element들을 입력합니다. Row vector의 element를 구분할 때에는 반드시 space 또는 반점(,)을 사용합니다.

Column vector 선언 시에도 마찬가지로 대괄호([ ]) 안에 element들을 입력하면 됩니다. 다만, row vector와는 달리 column vector의 element를 구분할 때에는 세미콜론(;) 또는 enter를 이용하여 구분시켜줍니다.


Fig 1. Assignment of row vectors(arr1, arr2) and column vectors(arr3, arr4)


Fig 1과 같이 사용자 지정 vector를 간단히 생성할 수 있습니다.

하지만 [1 2 3 ... 99 100]과 같이 element의 갯수가 상당히 많은 경우에는 이 방법이 비효율적이겠죠.

이러한 경우를 위한 효율적인 array 생성 방법이 따로 있습니다.

보편적인 표현을 사용하자면, 특정 범위 내에서 일정한 간격을 가지는 1D array를 생성하는 방법이겠네요.


여기에는 두 가지 방법이 있습니다.

첫째는 시작점과 종결점, 그리고 간격을 입력하는 방법입니다.

대괄호([ ]) 안에 시작점, 간격, 종결점을 순서대로 입력합니다. 각 입력은 콜론(:)으로 구분해주어야 합니다.

만약 간격이 입력되지 않았을 경우에는 default로 간격이 1로 설정됩니다.


Fig 2. 1D arrays with constant interval using colon


간격이 종결점에서 정확이 맞춰지지 않더라도 array는 정상적으로 생성됩니다(Fig 2의 arr7 참고).

다만 array의 마지막 element는 종결점을 넘어가지 않도록 설정됩니다.

만약 아래와 같이 array를 선언하면 어떻게 될까요?


>> arr_test[20:2:10]


이 경우, array는 생성되지만 element는 아무것도 갖지 않는 빈 array가 만들어집니다.


두번째 방법은 시작점과 종결점, 그리고 element 갯수를 입력하는 방식입니다.

함수 linspace를 이용하는 방법인데요, 순서대로 시작점, 종결점, 원하는 element 갯수를 입력합니다.

만약 element 갯수가 입력되지 않았을 경우에는 default로 총 100개의 element를 가지는 array를 반환합니다.


Fig 3. 1D arrays with constant interval using linspace



그럼 이제 2D array, 즉 matrix 생성에 대해서 알아봅시다


2D array 선언 방식은 1D array 선언 방식과 매우 유사합니다.

대괄호([ ]) 안에 element를 입력하는데요, row1의 element들을 입력한 다음 row2의 element를 입력, 다음에는 row3의 element를 입력하는 row by row 입력 방식을 따릅니다. Row 내의 element를 구분할 때에는 row vector 선언 시와 마찬가지로 space 또는 반점(,)을 사용하며, column 구분 시에는 column vector 선언과 마찬가지로 세미콜론(;) 또는 enter를 사용하여야 합니다.


Fig 4. Assignment of 2D arrays


1D array 선언 시에도 마찬가지지만, element들이 반드시 직접적인 숫자 형태를 띄지 않아도 됩니다.

수학적 표현을 element로 입력해줄 수도 있으며, 2D array의 경우 row 크기만 동일하다면 앞서 배운 linspace 함수를 이용하는 것 또한 가능합니다(Fig 4의 arr12 참고).


생성된 array의 이름 옆에 작은따옴표(')를 붙이면 transposed array를 확인할 수 있습니다.


Fig 5. Transposed arrays


등차 수열의 1D array를 생성하는 linspace처럼, 특별한 2D array를 생성하기 위한 함수도 있습니다.

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


 zeros(m,n)

 모든 element가 0인 mxn array 생성

 ones(m,n)

 모든 element가 1인 mxn array 생성

 rand(m,n)

 0부터 1 사이의 임의의 값을 element로 가지는 mxn array 생성

 eye(n)

 nxn identity matrix 생성

Table 1. Functions for special 2D arrays assignment


Fig 6. Several special 2D arrays



그렇다면 이제는 생성된 array 내부의 특정 element를 참조(indexing)하는 법에 대해 알아보겠습니다.

1D array에서 k번째 값을 참조하려면 어떻게 하면 될까요?

바로, 소괄호(( ))를 이용하여, 원하는 위치(여기서는 k)를 입력하면 됩니다.


Fig 7. Indexing in 1D array


주의할 점은, array의 첫 element의 index가 0이 아니라 1이라는 점입니다.

많은 언어에서는 0부터 시작하지만, MATLAB에서는 1부터 시작한다는 점을 유의하시기 바랍니다.


1D array에서의 참조 방식을 보니, 2D array의 참조 방식도 짐작이 가실 것입니다.

(m,n)자리의 element를 참조하기 위해서는 1D array와 마찬가지로 소괄호(( ))를 사용하시면 됩니다.

(이 부분은 간단하니 그림 첨부 없이 넘어가도록 하겠습니다)


하지만 하나의 element만 참조하리란 법은 없죠.

특정 범위의 element들을 모두 참조해야할 때도 있을 것입니다.

그 때는 바로 콜론(:)을 사용하시면 됩니다.


1D array의 m번째 element부터 n번째 element까지를 모두 참조하기 위해서는 아래의 명령어를 사용하시면 됩니다.


>> arr(m:n)


만약 m과 n이 입력되지 않는다면 어떻게 될까요?

바로, 모든 element를 참조합니다(row vector와 column vector 상관 없이 모든 element 참조).

그런데 이 경우, 1D array의 형태에 상관없이 결과값은 column vector의 형태로 반환되는군요(Fig 8, 9 참고).


Fig 8. Indexing using colon in a row vector


Fig 9. Indexing using colon in a column vector


당연히 콜론(:)을 이용하여 2D array에서도 여러 element를 참조할 수 있습니다.

앞서 'arr(m,n)'의 방식으로 m번째 row의 n번째 column에 저장된 element를 참조할 수 있다고 배웠는데요,

그렇다면 아래는 어떤 element를 참조하는지 생각해봅시다.


>> arr(m:n,p)


네, 바로 m번째 row부터 n번째 row까지의 element 중에서 p번째 column에 해당하는 element들을 참조하게 됩니다.

아래 Table 2에 보다 구체적으로 정리해놓았으니 참고하시면 되겠습니다.


 arr(:,n)

 n번째 column의 모든 element를 참조

 arr(m,:)

 m번째 row의 모든 element를 참조

 arr(:,p:q)

 p번째 column부터 q번째 column까지의 모든 element를 참조

 arr(m:n,:)

 m번째 row부터 n번째 row까지의 모든 element를 참조

 arr(m:n,p:q)

 m번째 row부터 n번째 row까지의 모든 element 중, p번째 column부터 q번째 column 사이에 해당되는 모든 element를 참조 

Table 2. Indexing using colon in a 2D array


Fig 10. Indexing using colon in a 2D array


지금까지 배웠던 참조 방식을 응용하면 아래와 같이 복잡한 참조 또한 가능합니다.


Fig 11. Complex indexing using square brackets, colons, and commas



참조 방식을 이용하여 기존에 선언된 array를 부분 추가, 부분 삭제와 같은 수정을 할 수도 있습니다.

예를 들어 arr라는 이름의 2x3 2D array가 이미 선언되있을 때, 아래와 같은 명령어를 입력하면 부분 추가가 가능합니다.


>> arr(4,4) = 17


원래 2x3 크기의 arr는 위의 명령에 의해 4x4 matrix로 확장되며, 동시에 (4,4) 자리에는 17이 추가됩니다.

그러면 그 외의 자리는 어떻게 될까요? 모두 default로 0이 assign 됩니다.


Fig 12. Adding elements in a 2D array


Fig 13과 같이, row 또는 column의 크기만 같다면 두 matrix를 합칠 수도 있습니다.

물론 vector 또한 가능하구요.


Fig 13. Appending two matrices


부분 삭제 또한 간단합니다. 삭제하고자 하는 부분을 참조하고, 그 자리에 빈 array를 assign하면 됩니다.


Fig 14. Delete elements in a 2D array




마지막으로 array의 size에 관한 함수 두 가지를 소개해드리며 오늘 포스팅을 마무리 짓겠습니다.


 length(A)

 1D array인 A의 길이를 반환

 >> A = [5 9 2 4];

 >> length(A)

 ans =

         4

 size(A)

 2D array인 A의 row와 column의 갯수를 반환

 >> A = [5 1 6; 8 0 2];

 >> size(A)

 ans =

         2     3

Table 3. Functions related to size of array




다음에는 array간의 연산에 관하여 포스팅하겠습니다.

감사합니다







Comments