MATLAB: 다차원 배열과 특수 배열 마스터하기
MATLAB의 특수 배열
MATLAB의 모든 변수는 데이터 유형에 관계없이 다차원 배열입니다. 벡터는 1차원 배열이고, 행렬은 2차원 배열입니다. 앞선 장에서 벡터와 행렬을 다루었으므로, 이번 장에서는 다차원 배열을 다루기 전에 몇 가지 특수 배열 유형을 먼저 살펴보겠습니다.
특수 배열 생성 함수
이 섹션에서는 특수 배열을 생성하는 함수들을 소개합니다. 이들 함수는 인수 하나만 주면 정사각형 배열을, 두 개를 주면 직사각형 배열을 만듭니다.
zeros() 함수
모든 요소가 0인 배열을 생성합니다.
zeros(5)
실행 결과:
ans =
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
ones() 함수
모든 요소가 1인 배열을 생성합니다.
ones(4,3)
실행 결과:
ans =
1 1 1
1 1 1
1 1 1
1 1 1
eye() 함수
단위 행렬(identity matrix)을 생성합니다.
eye(4)
실행 결과:
ans =
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
rand() 함수
(0, 1) 구간에서 균일 분포를 따르는 난수로 구성된 배열을 생성합니다.
rand(3, 5)
실행 결과 (예시):
ans =
0.8147 0.9134 0.2785 0.9649 0.9572
0.9058 0.6324 0.5469 0.1576 0.4854
0.1270 0.0975 0.9575 0.9706 0.8003
마방진(Magic Square)
마방진은 행, 열, 대각선 방향으로 요소를 더했을 때 모두 같은 합이 나오는 정사각 행렬입니다.
magic() 함수는 마방진 배열을 생성합니다. 크기를 나타내는 스칼라 인수 하나(3 이상)를 받습니다.
magic(4)
실행 결과:
ans =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
다차원 배열
두 개 이상의 차원을 가진 배열을 MATLAB에서는 다차원 배열이라 합니다. 이는 일반 2차원 행렬의 확장 개념입니다.
일반적으로 2차원 배열을 먼저 만든 뒤 차원을 확장하여 다차원 배열을 생성합니다.
예제: 3차원 배열 만들기
먼저 3x3 2차원 배열 a를 생성합니다.
a = [7 9 5; 6 1 9; 4 3 2]
실행 결과:
a =
7 9 5
6 1 9
4 3 2
이제 a(:,:,2)에 값을 할당하여 세 번째 차원을 추가합니다.
a(:, :, 2) = [1 2 3; 4 5 6; 7 8 9]
실행 결과:
a(:,:,1) =
7 9 5
6 1 9
4 3 2
a(:,:,2) =
1 2 3
4 5 6
7 8 9
ones, zeros, rand로 다차원 배열 생성
b = rand(4,3,2)
4x3x2 크기의 3차원 난수 배열이 생성됩니다.
cat() 함수로 배열 결합
cat() 함수는 지정된 차원을 따라 배열들을 연결합니다.
B = cat(dim, A1, A2, ...)
B: 새로 생성된 배열
A1, A2, ...: 연결할 배열들
dim: 연결할 차원
예제
a = [9 8 7; 6 5 4; 3 2 1];
b = [1 2 3; 4 5 6; 7 8 9];
c = cat(3, a, b, [2 3 1; 4 7 8; 3 9 0])
실행 결과:
c(:,:,1) =
9 8 7
6 5 4
3 2 1
c(:,:,2) =
1 2 3
4 5 6
7 8 9
c(:,:,3) =
2 3 1
4 7 8
3 9 0
배열 조작 함수
MATLAB은 배열의 정렬, 회전, 순열 변경, 형태 변환, 이동 등을 위한 다양한 함수를 제공합니다.
| 함수 | 용도 |
| length | 벡터 길이 또는 최대 배열 차원 |
| ndims | 배열 차원 수 |
| numel | 배열 요소 개수 |
| size | 배열 크기 |
| iscolumn | 열 벡터 여부 판단 |
| isempty | 빈 배열 여부 판단 |
| ismatrix | 행렬 여부 판단 |
| isrow | 행 벡터 여부 판단 |
| isscalar | 스칼라 여부 판단 |
| isvector | 벡터 여부 판단 |
| blkdiag | 블록 대각 행렬 구성 |
| circshift | 순환 이동 |
| ctranspose | 복소 공액 전치 |
| diag | 대각 행렬 및 대각 요소 |
| flipdim | 지정 차원 기준 뒤집기 |
| fliplr | 좌우 뒤집기 |
| flipud | 상하 뒤집기 |
| ipermute | N-D 배열 차원 순열 역변환 |
| permute | N-D 배열 차원 재배열 |
| repmat | 배열 복제 및 타일링 |
| reshape | 배열 형태 변경 |
| rot90 | 90도 회전 |
| shiftdim | 차원 이동 |
| issorted | 정렬 여부 확인 |
| sort | 오름차순/내림차순 정렬 |
| sortrows | 행 기준 정렬 |
| squeeze | 크기 1인 차원 제거 |
| transpose | 전치 |
| vectorize | 표현식 벡터화 |
예제: 길이, 차원, 요소 수
x = [7.1, 3.4, 7.2, 28/4, 3.6, 17, 9.4, 8.9];
length(x) % x 벡터의 길이
y = rand(3, 4, 5, 2);
ndims(y) % y 배열의 차원 수
s = ['Zara', 'Nuha', 'Shamim', 'Riz', 'Shadab'];
numel(s) % s의 요소 수
실행 결과:
ans = 8
ans = 4
ans = 23
예제: 배열 요소 순환 이동
a = [1 2 3; 4 5 6; 7 8 9];
b = circshift(a, 1); % 첫 번째 차원을 아래로 1 이동
c = circshift(a, [1 -1]); % 첫 번째 차원 아래로 1, 두 번째 차원 왼쪽으로 1 이동
실행 결과:
a =
1 2 3
4 5 6
7 8 9
b =
7 8 9
1 2 3
4 5 6
c =
8 9 7
2 3 1
5 6 4
배열 정렬
v = [23 45 12 9 5 0 19 17];
sort(v) % 벡터 정렬
m = [2 6 4; 5 3 9; 2 0 1];
sort(m, 1) % 행 방향(열별) 정렬
sort(m, 2) % 열 방향(행별) 정렬
실행 결과:
v =
23 45 12 9 5 0 19 17
ans =
0 5 9 12 17 19 23 45
m =
2 6 4
5 3 9
2 0 1
ans =
2 0 1
2 3 4
5 6 9
ans =
2 4 6
3 5 9
0 1 2
셀 배열(Cell Array)
셀 배열은 인덱싱된 셀들의 배열로, 각 셀은 서로 다른 차원과 데이터 유형을 가진 배열을 저장할 수 있습니다.
cell 함수로 셀 배열 생성
C = cell(dim)
C = cell(dim1, ..., dimN)
D = cell(obj)
C: 셀 배열
dim: 스칼라 정수 또는 정수 벡터로 셀 배열의 차원 지정
dim1, ..., dimN: 각 차원 크기를 지정하는 스칼라 정수들
obj: Java 배열/객체 또는 .NET System.String/System.Object 배열
예제
c = cell(2, 5);
c = {'Red', 'Blue', 'Green', 'Yellow', 'White'; 1 2 3 4 5}
실행 결과:
c =
2×5 셀 배열
{'Red' } {'Blue' } {'Green' } {'Yellow'} {'White' }
{[ 1]} {[ 2]} {[ 3]} {[ 4]} {[ 5]}
셀 배열 데이터 접근
셀 배열 요소를 참조하는 두 가지 방법이 있습니다.
- 소괄호
() 사용: 셀들의 집합을 참조
- 중괄호
{} 사용: 개별 셀 내부의 데이터를 참조
소괄호로 셀 집합 참조
c = {'Red', 'Blue', 'Green', 'Yellow', 'White'; 1 2 3 4 5};
c(1:2, 1:2)
실행 결과:
ans =
2×2 셀 배열
{'Red' } {'Blue'}
{[ 1]} {[ 2]}
중괄호로 셀 내용 참조
c{1, 2:4}
실행 결과:
ans = 'Blue'
ans = 'Green'
ans = 'Yellow'