배열 유형
다차원 배열
MATLAB® 환경의 다차원 배열은 첨자가 두 개를 초과하는 배열을 말합니다. 다차원 배열을 생성하는 한 가지 방법은 zeros
, ones
, rand
, randn
중 하나를 세 개 이상의 인수와 함께 호출하는 것입니다. 예를 들면 다음과 같습니다.
R = randn(3,4,5);
이렇게 하면 정규분포의 임의 요소 개수가 총 3*4*5 = 60
개인 3×4×5 배열이 만들어집니다.
3차원 배열은 사각 그리드에서 샘플링된 방 안의 온도와 같이 3차원 물리적 데이터를 나타낼 수 있습니다. 또는 A(k)로 일련의 행렬을 나타내거나 A(t)와 같은 시간 종속형 행렬의 샘플을 나타낼 수도 있습니다. 이 두 가지 예의 경우 k번째 행렬의 (i, j)번째 요소 또는 tk번째 행렬은 A(i,j,k)
로 나타냅니다.
MATLAB 버전의 4차 마방진과 뒤러(Durer) 버전의 4차 마방진은 두 열의 위치가 서로 바뀐 점이 다릅니다. 많은 마방진은 열의 위치를 교환하는 방식으로 생성할 수 있습니다. 다음 명령문은
p = perms(1:4);
4! = 24인 1:4
순열을 생성합니다. k
번째 순열은 행 벡터 p(k,:)
입니다. 그리고 다음과 같습니다.
A = magic(4); M = zeros(4,4,24); for k = 1:24 M(:,:,k) = A(:,p(k,:)); end
위의 식을 사용하여 24개의 마방진이 3차원 배열 M
에 저장됩니다. M
의 크기는 다음과 같습니다.
size(M) ans = 4 4 24
참고
이 그림에 나와 있는 행렬의 차수는 각 사용자의 결과와 다를 수 있습니다. perms
함수는 항상 입력 벡터의 모든 순열을 반환하지만 순열의 차수는 MATLAB 버전마다 다를 수 있습니다.
다음 명령문은
sum(M,d)
d
번째 첨자를 변경하여 합을 구합니다. 따라서 다음을 실행하면
sum(M,1)
행 벡터의 24개 복사본이 포함된 1×4×24 배열이 생성됩니다.
34 34 34 34
또한
sum(M,2)
위의 경우에는 열 벡터의 24개 복사본이 포함된 4×1×24 배열이 생성됩니다.
34 34 34 34
마지막으로 다음은
S = sum(M,3)
3차원 방향으로 나열된 24개 행렬의 합을 구합니다. 결과로 얻게 된 크기는 4×4×1이므로 4×4 배열의 형태를 갖추게 됩니다.
S = 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204
셀형 배열
MATLAB의 셀형 배열은 다른 배열의 복사본을 요소로 갖는 다차원 배열입니다. cell
함수를 사용하면 빈 행렬로 구성된 셀형 배열을 만들 수 있습니다. 하지만 이 방법보다는 여러 항목을 중괄호 {}
로 묶어 셀형 배열을 만드는 방식이 더 자주 사용됩니다. 다양한 셀의 내용에 액세스하는 경우에도 첨자와 함께 중괄호를 사용합니다. 예를 들면 다음을 입력합니다.
C = {A sum(A) prod(prod(A))}
이 경우 1×3 셀형 배열이 생성됩니다. 세 개의 셀은 마방진, 열의 합으로 구성된 행 벡터, 그리고 해당하는 모든 요소의 곱으로 이루어져 있습니다. C
는 다음과 같이 표시됩니다.
C = [4x4 double] [1x4 double] [20922789888000]
이렇게 표시되는 이유는 처음 두 개의 셀은 너무 크기 때문에 제한된 공간에 출력할 수 없지만 세 번째 셀에는 단일 숫자인 16!만 포함되어 있으므로 출력할 공간이 충분하기 때문입니다.
여기서 기억해야 할 두 가지 사항은 다음과 같습니다. 첫째로, 여러 셀 중 한 셀의 내용을 가져오려면 중괄호 속에 첨자를 사용합니다. 예를 들어, C{1}
은 마방진이며 C{3}
은 16!입니다. 둘째로, 셀형 배열에는 다른 배열의 포인터가 아닌 복사본이 포함됩니다. 이후에 A
를 변경해도 C
에는 아무런 영향이 발생하지 않습니다.
3차원 배열을 사용하여 크기가 같은 일련의 행렬을 저장할 수 있습니다. 셀형 배열을 사용하여 크기가 서로 다른 일련의 행렬을 저장할 수도 있습니다. 예를 들면 다음과 같습니다.
M = cell(8,1); for n = 1:8 M{n} = magic(n); end M
이 경우 다음과 같이 크기가 각기 다른 마방진이 생성됩니다.
M = [ 1] [ 2x2 double] [ 3x3 double] [ 4x4 double] [ 5x5 double] [ 6x6 double] [ 7x7 double] [ 8x8 double]
다음을 통해 4×4 마방진을 가져올 수 있습니다.
M{4}
문자와 텍스트
MATLAB에 텍스트를 입력할 때는 작은따옴표를 사용합니다. 예를 들면 다음과 같습니다.
s = 'Hello'
위의 식을 사용하여 얻는 결과는 지금까지 다뤄왔던 숫자형 행렬 또는 숫자형 배열 유형과는 다른 1×5 문자형 배열입니다.
내부적으로는 문자가 숫자로 저장되지만 부동소수점 형식으로는 저장되지 않습니다. 다음 명령문은
a = double(s)
문자형 배열을 각 문자에 대한 ASCII 코드의 부동소수점 표현을 포함한 숫자형 행렬로 변환합니다. 결과는 다음과 같습니다.
a = 72 101 108 108 111
다음 명령문은
s = char(a)
반대로 변환합니다.
숫자를 문자로 변환하면 컴퓨터에서 사용할 수 있는 다양한 글꼴을 확인할 수 있습니다. 기본적인 ASCII 문자 집합에서 출력 가능한 문자는 정수 32:127
로 표현됩니다. 32 미만의 정수는 출력할 수 없는 제어 문자를 나타냅니다. 이 정수들은 다음을 통해 적절한 6×16 배열로 정렬됩니다.
F = reshape(32:127,16,6)';
확장된 ASCII 문자 집합에서 출력 가능한 문자는 F+128
로 표현됩니다. 이 정수들이 문자로 해석되는 경우 결과는 현재 사용되는 글꼴에 따라 달라집니다. 먼저 다음 명령문을 입력합니다.
char(F) char(F+128)
그 다음 명령 창에서 사용되는 글꼴을 변경합니다. 글꼴을 변경하려면 홈 탭의 환경 섹션에서 기본 설정 > 글꼴을 클릭하십시오. 코드 라인에 탭을 포함하는 경우 Monospaced
같은 고정 너비 글꼴을 사용하여 탭 위치를 각기 다른 라인에 정렬합니다.
대괄호를 사용하여 결합하면 텍스트 변수가 서로 연결됩니다. 다음 명령문은
h = [s, ' world']
문자를 가로로 연결하고 다음과 같은 결과를 생성합니다.
h = Hello world
다음 명령문은
v = [s; 'world']
문자를 세로로 연결하고 다음과 같은 결과를 생성합니다.
v = Hello world
여기서 h
의 'w'
앞에는 공백을 삽입해야 하며 v
의 두 단어는 모두 길이가 같아야 합니다. 결과로 생성되는 배열은 둘 다 문자형 배열입니다. h
는 1×11 배열이고 v
는 2×5 배열입니다.
서로 다른 길이의 라인이 포함된 텍스트 본문을 조작하려면 두 가지 방법을 사용할 수 있습니다. 문자형 배열로 채워서 같은 길이를 만들거나 문자형 벡터로 구성된 셀형 배열을 사용하는 것입니다. 문자형 배열을 생성하는 경우에는 배열의 각 행 길이를 동일하게 만들어야 합니다. 이때 짧은 행의 끝은 공백으로 채워집니다. char
함수를 사용하면 이러한 채우기 동작을 자동으로 수행할 수 있습니다. 예를 들면 다음과 같습니다.
S = char('A','rolling','stone','gathers','momentum.')
이 경우 5×9 문자형 배열이 생성됩니다.
S = A rolling stone gathers momentum.
또는 텍스트를 셀형 배열에 저장할 수도 있습니다. 예를 들면 다음과 같습니다.
C = {'A';'rolling';'stone';'gathers';'momentum.'}
이 경우 채우기가 필요 없는 5×1 셀형 배열이 생성됩니다. 채우기가 필요 없는 이유는 배열의 각 행 길이가 서로 달라도 되기 때문입니다.
C = 'A' 'rolling' 'stone' 'gathers' 'momentum.'
다음을 통해 채워진 문자형 배열을 문자형 벡터로 구성된 셀형 배열로 변환할 수 있습니다.
C = cellstr(S)
또한 다음을 통해 이 과정을 역으로 수행합니다.
S = char(C)
구조체
구조체는 다차원 MATLAB 배열입니다. 구조체의 요소는 텍스트 필드 지정자를 통해 액세스할 수 있습니다. 예를 들면 다음과 같습니다.
S.name = 'Ed Plum'; S.score = 83; S.grade = 'B+'
이 경우 필드 개수가 세 개인 스칼라 구조체가 생성됩니다.
S = name: 'Ed Plum' score: 83 grade: 'B+'
MATLAB 환경의 다른 모든 것과 마찬가지로 구조체 역시 배열이므로 요소를 추가로 삽입할 수 있습니다. 이 경우 배열의 각 요소는 여러 개의 필드가 포함된 구조체입니다. 필드는 다음과 같이 한 번에 하나씩 추가할 수도 있고
S(2).name = 'Toni Miller'; S(2).score = 91; S(2).grade = 'A-';
하나의 명령문을 사용하여 요소 전체를 추가할 수도 있습니다.
S(3) = struct('name','Jerry Garcia',... 'score',70,'grade','C')
지금은 구조체의 크기가 요약만 출력하기에 충분한 정도입니다.
S = 1x3 struct array with fields: name score grade
여러 가지 방법으로 다양한 필드를 MATLAB 배열로 다시 어셈블할 수 있습니다. 이 방법들은 주로 쉼표로 구분된 목록 표기법을 기반으로 합니다. 다음을 입력하는 경우
S.score
다음을 입력하는 경우와 동일합니다.
S(1).score, S(2).score, S(3).score
그리고 이는 쉼표로 구분된 목록을 나타냅니다.
이러한 목록을 생성하는 표현식을 대괄호로 묶는 경우 MATLAB에서는 목록의 각 항목을 배열에 저장합니다. 이 예제의 경우 MATLAB에서는 구조체형 배열 S
에 있는 각 요소의 score
필드가 포함된 숫자형 행 벡터를 생성합니다.
scores = [S.score] scores = 83 91 70 avg_score = sum(scores)/length(scores) avg_score = 81.3333
텍스트 필드 중 하나(예: name
)에서 문자형 배열을 생성하려면 S.name
을 사용하여 생성되는 쉼표로 구분된 목록에 char
함수를 호출하십시오.
names = char(S.name) names = Ed Plum Toni Miller Jerry Garcia
마찬가지로, 목록 생성 표현식을 중괄호로 묶는 방법으로 name
필드에서 셀형 배열을 생성할 수도 있습니다.
names = {S.name} names = 'Ed Plum' 'Toni Miller' 'Jerry Garcia'
구조체형 배열에 있는 각 요소의 필드를 구조체 외부에 있는 별도의 변수에 대입하려면 출력값을 등호 왼쪽에 지정하고 모두 대괄호로 묶습니다.
[N1 N2 N3] = S.name N1 = Ed Plum N2 = Toni Miller N3 = Jerry Garcia
동적 필드 이름
구조체의 데이터에 액세스하기 위해 가장 일반적으로 사용되는 방법은 참조할 필드의 이름을 지정하는 것입니다. 또한 동적 필드 이름을 사용하여 구조체 데이터에 액세스할 수도 있습니다. 이 이름들은 필드를 MATLAB에서 런타임에 실행하는 가변 표현식으로 표현합니다. 아래에 나와 있는 점-괄호 구문을 사용하면 expression
이 동적 필드 이름으로 지정됩니다.
structName.(expression)
표준 MATLAB 인덱싱 구문을 사용하여 이 필드의 요소를 참조해 보겠습니다. 예를 들어, expression
을 필드 이름으로 실행하고 행 7
의 열 1
에서 25
까지 이 필드의 값을 구하려면 다음을 사용하십시오.
structName.(expression)(7,1:25)
동적 필드 이름 예. 아래 나와 있는 avgscore
함수는 동적 필드 이름으로 testscores
구조체에서 정보를 가져와서 평균 테스트 점수를 계산합니다.
function avg = avgscore(testscores, student, first, last) for k = first:last scores(k) = testscores.(student).week(k); end avg = sum(scores)/(last - first + 1);
이 함수를 실행할 때 동적 필드 student
에 각기 다른 값을 사용할 수 있습니다. 먼저, 25주의 기간에 대한 점수가 포함된 구조체를 초기화합니다.
testscores.Ann_Lane.week(1:25) = ... [95 89 76 82 79 92 94 92 89 81 75 93 ... 85 84 83 86 85 90 82 82 84 79 96 88 98]; testscores.William_King.week(1:25) = ... [87 80 91 84 99 87 93 87 97 87 82 89 ... 86 82 90 98 75 79 92 84 90 93 84 78 81];
이제 런타임에 동적 필드 이름을 사용하여 testscores
구조체에 대해 학생 이름 필드를 제공하는 방식으로 avgscore
를 실행합니다.
avgscore(testscores, 'Ann_Lane', 7, 22) ans = 85.2500 avgscore(testscores, 'William_King', 7, 22) ans = 87.7500