530 likes | 934 Views
MATLAB 개요와 응용 2 장 배열 생성. 강의 내용. 1 차원 배열 ( 벡터 ) 의 생성 2 차원 배열 ( 행렬 ) 의 생성 전치 연산자 배열 주소지정 콜론의 사용 배열 원소의 추가 및 삭제 배열 처리를 위한 내장함수 문자열과 문자열 변수 예제. 배열은 MATLAB 이 데이터를 저장하고 다루기 위해 사용하는 기본적인 형태로서 , 행 (row) 이나 열 (column), 또는 행과 열로 정렬된 수들의 나열이다 . 1 차원 배열 ( 벡터 ) 로 나타낼 수 있는 예 :
E N D
강의 내용 • 1차원 배열(벡터)의 생성 • 2차원 배열(행렬)의 생성 • 전치 연산자 • 배열 주소지정 • 콜론의 사용 • 배열 원소의 추가 및 삭제 • 배열 처리를 위한 내장함수 • 문자열과 문자열 변수 • 예제 2장 배열과 행렬
배열은 MATLAB이 데이터를 저장하고 다루기 위해 사용하는 기본적인 형태로서, 행(row)이나 열(column), 또는 행과 열로 정렬된 수들의 나열이다. • 1차원 배열(벡터)로 나타낼 수 있는 예 : • 3차원 공간의 한 점 P의 좌표가 (2, 5, 6)일 때 이 좌표를 배열 [2 5 6]또는 [2, 5, 6]으로 나타낼 수 있다. • 어떤 수들의 집합도 벡터로 나타낼 수 있다. 예) 어느 도시의 연도별 인구수에 대한 표에서 연도와 인구수를 벡터로 표시할 수 있다. >> year = [1984 1986 1988 1990 1992 1994 1996] >> pop = [127 130 136 145 158 178 211]; z P (2,5, 6) y x 1차원 배열의 생성 (1/2) 2장 배열과 행렬
알려진 수 집합을 행벡터(row vector)로 만들기 • 꺾은 괄호 [ ] 안에 알려진 원소들을 기입하며, 원소와 원소는 공백이나 콤마(,)로 구분한다. variable_name = [벡터 원소들의 나열] >> t = [5, 7, 2, 4 10 29] % 공백이나 콤마로 원소를 구분한다 >> t = [0, 0.4*pi, 0.8*pi, 1.2*pi, 1.5*pi, 2*pi]; % 수식표현도 가능하다 >> t = [0 0.4 0.8 1.2 1.5 2]*pi % 위의 결과와 같다 1차원 배열의 생성 (2/2) • 배열의 생성 방법 • 꺾은 괄호 [ ] 안에 배열의 원소들을 직접 입력함 • 외부 데이터 파일로부터 행렬을 읽어 들임 • MATLAB 명령어나 자신이 만든 m 파일을 이용하여 행렬을 생성시킴 • 벡터의 각 원소는 수, 또는 미리 정의된 변수들, 함수들이 포함된 수학식 등이 될 수 있다. 2장 배열과 행렬
>> v = [3; 4; 5] v = 3 4 5 >> v = [3 4 5] v = 3 4 5 >> v = [3 4 5]' v = 3 4 5 열벡터(Column vector)의 생성 • 열벡터(Column vector)를 생성하는 세 가지 방법 • 꺾은 괄호 속에서 원소 뒤에 세미콜론(;)을 입력하면 줄이 바뀐다. • 각 원소 뒤에서 Enter 키를 눌러 바뀐 줄에 새로운 원소를 입력한다. • 행벡터 입력을 마친 후 꺾은 괄호 뒤에 따옴표(' )를 입력하여 행벡터를 전치(transpose)시킨다. 2장 배열과 행렬
일정한 간격으로 커지는 행벡터의 생성 • 일정한 간격으로 커지는 원소들을 가진 벡터는 콜론(:)을 사용하여 생성한다. variable_name = [m : q : n] or variable_name = m : q : n or variable_name = (m : q : n) • m은 첫번째 원소이며, m+q, m+2q, … 와 같이 q씩 커지면서 원소가 생성되고, 최종 원소는 n을 초과할 수 없다. • m-n이 q의 정수배이면 최종원소는 n이지만, 그렇지 않으면 n보다 작은 값이 된다. n이 생략되면 원소는 1씩 커진다. q가 음수인 경우 m은 반드시 n보다 커야 한다. >> x = [1:2:8] >> x=(0:0.5:1)*pi x=1 3 5 7 x=0 1.5708 3.1416 >> x=15:-3:8 >> t= -1:0.5:1 x=15 12 9 t=-1.0000 -0.5000 0 0.5000 1.0000 2장 배열과 행렬
원소의 개수를 지정하여 행벡터 생성하기 • 시작원소 xi와 최종원소 xf, 원소의 개수 n이 정해져 있을 때, 일정한 간격을 가진 벡터의 생성은 linspace명령을 이용한다. variable_name = linspace(xi, xf, n) • 콜론에 의한 벡터 생성과 달리 최종원소의 값은 항상 xf 이다. • 원소는 (xf – xi)/(n-1)만큼씩 증가한다. • 원소 개수 n을 생략하면, 기본적으로 100개의 원소를 생성한다. >> x = linspace(2, 14, 6) % 2부터 14까지 6개의 원소를 생성 x = 2.0000 4.4000 6.8000 9.2000 11.6000 14.0000 >> delta_x = (14-2)/5 delta_x = 2.4 >> t = 2:delta_x:14 t = 2.0000 4.4000 6.8000 9.2000 11.6000 14.0000 >> y = linspace( 0.1, 10) % 개수를 지정하지 않으면 무조건 100개 생성 y = 0.1000 0.2000 0.3000 … 9.8000 9.9000 10.0000 2장 배열과 행렬
1 1 1 >> t = logspace(0, 3, 4) t = 1 10 100 1000 >> x= logspace(1, 5, 3) x = 10 1000 100000 >> y=logspace(1, 2, 4) y = 10.0000 21.5443 46.4159 100.0000 log10100 ( = 0 ) log10101 ( = 1 ) log10102 ( = 2 ) log10103 ( = 3 ) logspace명령어에 의한 벡터 생성 • 로그적으로 같은 간격을 가진 행벡터(row vector)를 생성한다. y = logspace(a, b, n) • a와 b 사이가 아니라 10a와 10b사이에 n개의 로그적으로 같은 간격의 행벡터를 생성한다. • n이 생략되면 50개의 원소를 생성한다. 2장 배열과 행렬
‘’ 표시는 공백을 의미함 복소수 벡터 • 복소수를 벡터의 원소로 입력할 때 복소수에는 어떠한 공백도 있어서는 안 된다.예를 들어 복소수 1-2i 를 벡터의 원소로 입력할 때 모든 글자는 공백 없이 붙여 써야 한다. 만일 1 -2i와 같이 1과 -2i를 띄어 쓰면 두 개의 원소로 인식하게 된다. >> c1 = [1-2i 3 5+6i] % 세 개의 원소를 가진 벡터 c1 = 1.0000 - 2.0000i 3.0000 5.0000 + 6.0000i >> c2 = [1-2i 3 5+6i] % 복소수의 공백으로 4개의 원소로 인식 % 그러나 5+ 다음의 공백은 +연산자로 인해 무시된다. c2 = 1.0000 0 - 2.0000i 3.0000 5.0000 + 6.0000i >> c3 = [(1-2i) 3 ( 5+ 6i)] % 괄호로 인해 공백이 무시된다. c2 = 1.0000 - 2.0000i 3.0000 5.0000 + 6.0000i 2장 배열과 행렬
2차원 배열은 행렬(matrix)로도 불리며 다수의 행과 열을 갖는다. 세미콜론(;)이나 엔터(Enter)키는 새로운 열(row)을 만드는 역할을 하므로 원소들 끝에 세미콜론을 입력하거나 엔터 키를 누름으로써 원하는 행렬을 만들 수 있다. Enter 키 >> A=[2 4 10 16 3 7 8 12 35] A = 2 4 10 16 3 7 8 12 35 세미콜론 2차원 배열(행렬)의 생성 >> A=[2 4 10; 16 3 7; 8 12 35] A = 2 4 10 16 3 7 8 12 35 의 입력 2장 배열과 행렬
행렬 원소는 숫자 뿐만 아니라 계산이 가능한 수식, 변수도 가능하다. 또 linspace나 콜론(:)을 이용하여 원소를 자동으로 생성하는 것도 가능하다. >> A=[2 4 10;linspace(8, -2, 3)] A = 2 4 10 8 3 -2 >> A=[2 4 10; 8: -5: -2 ] A = 2 4 10 8 3 -2 >> A=[A; 10 20 30] A = 2 4 10 8 3 -2 10 20 30 행렬 생성의 다양한 방법 (1/2) >> x=4; y=2; z=8; % 세 변수의 정의 >> A=[x y z; sin(x/z) x^2 x+y] A = 4.0000 2.0000 8.0000 0.4794 16.0000 6.0000 >> A=[1:2:11; 0:5:25; linspace(10, 60, 6);67 2 43 68 4 13] A= 1 3 5 7 9 11 0 5 10 15 20 25 10 20 30 40 50 60 67 2 43 68 4 13 2장 배열과 행렬
>> r1=[2, 4, 10]; r2=[16, 3, 7]; >> A=[r1; r2] A = 2 4 10 16 3 7 >> A=[[2, 4, 10]; [16, 3, 7]] % A=[2, 4, 10; 16, 3, 7]과 같다. A = 2 4 10 16 3 7 >> v=[r1 r2] v = 2 4 10 16 3 7 >> cd=6; h=4; >> Mat=[3, cd*h, cos(pi/3) ; h^2, sqrt(h*h/cd), 14] Mat= 3.0000 24.0000 0.5000 16.0000 1.6330 14.0000 행렬 생성의 다양한 방법 (2/2) 2장 배열과 행렬
>> Z = zeros(2 : 3) Z = 0 0 0 0 0 0 >> O = ones(2, 2) O = 1 1 1 1 >> I = eye(3) I = 1 0 0 0 1 0 0 0 1 >> B = ones(size(Z)) B = 1 1 1 1 1 1 행렬 명령어 – zeros, ones, eye • zeros(m, n), ones(m, n), eye(n) 명령들은 특수한 원소들을 갖는 행렬을 만드는 데 사용된다. • zeros(m, n) : 원소가 모두 0인 m n 크기의 행렬 • ones(m, n) : 원소가 모두 1인 m n 크기의 행렬 • eye(n) : 대각선 원소만 1이고 나머지 원소들은 모두 0인 n n 의 행렬 2장 배열과 행렬
MATLAB 변수에 대한 유의사항 • MATLAB의 모든 변수들은 배열이다.스칼라는 원소가 하나인 배열이고, 벡터는 원소들의 행이나 열이 하나인 배열이며, 행렬은 원소들이 행과 열로 되어 있는 배열이다. • 변수(스칼라, 벡터, 행렬)는 변수가 할당될 때의 입력에 의해 정의된다. 원소를 할당하기 전에 배열의 크기를 정의할 필요는 없다. • 변수가 스칼라나 벡터, 또는 행렬로서 존재하면, 이 변수의 크기나 유형은 마음대로 변경할 수 있다. • 스칼라 ⇒ 벡터, 또는 행렬 • 벡터 ⇒ 스칼라, 다른 크기의 벡터, 또는 행렬 • 행렬의 크기를 바꾸거나 벡터나 스칼라로 축소시킬 수도 있다. 2장 배열과 행렬
>> A=[1 2 3; 10 20 30] A = 1 2 3 10 20 30 >> B=A’ B= 1 10 2 20 3 30 전치(transpose) 연산자 >> v=[10; 20; 30]; >> vt = v’ vt = 10 20 30 >> x=[10 20 30]; xt = x’ xt = 10 20 30 • 행벡터를 열벡터로, 열벡터를 행벡터로 변환하거나, 행렬의 행과 열을 바꾸는 전치 연산은 벡터나 행렬 뒤에 따옴표(')를 붙이면 된다. 2장 배열과 행렬
>> C=[1 2+3i; 2-3i 4] C = 1 2+3i 2-3i 4 >> C‘ ans = 1 2+3i 2-3i 4 >> C. ' ans = 1 2-3i 2+3i 4 복소수 행렬의 전치(transpose) (1/2) • 복소수 벡터나 복소수 행렬을 전치시키면, 복소수 원소는 모두 공액복소수로 바뀐 다음에 전치(complex conjugate transpose)된다는 점에 주의. • 복소수 벡터나 복소수 행렬을 공액복소수 변환없이 단순히 전치만 시키고자 하는 경우에는 .' 와 같이 마침표와 따옴표를 같이 사용한다. >> v=[1+2i 3+4i] v = 1.0000+2.0000i 3.0000+4.0000i >> w=v' w = 1.0000 - 2.0000i 3.0000 - 4.0000i >> x=v.' x = 1.0000 + 2.0000i 3.0000 + 4.0000i 2장 배열과 행렬
복소수 행렬의 전치(transpose) (2/2) >> r = 1 : 3; >> C = r + r*i C = 1.0000 + 1.0000i 2.0000 + 2.0000i 3.0000 + 3.0000i >> Ct = C' Ct = 1.0000 - 1.0000i 2.0000 - 2.0000i 3.0000 - 3.0000i >> Cdt=C.' Cdt = 1.0000 + 1.0000i 2.0000 + 2.0000i 3.0000 + 3.0000i 2장 배열과 행렬
벡터 원소의 주소 지정(Array addressing) • 행렬이나 배열에서 한 개 또는 여러 개의 원소의 위치를 찾거나 접근할 수 있다. 이것은 행렬이나 배열의 일부 원소들의 값을 갱신하거나 계산에서 특정 원소를 이용하려고 할 때, 또는 일부 원소들을 새 변수에 할당하고자 할 때 유용하게 사용될 수 있다. • 벡터에서 원소의 주소는 첫번째 원소로부터 해당 원소의 순서이다.벡터 v에서 v(k)는 k번째의 벡터 v의 원소를 나타낸다. 즉, 벡터 v=[12 8 9 6 28]에서v(1)=12, v(3)=9, v(5)=28이다. 벡터의 한 원소를 나타내는 v(k)는 변수처럼 사용할 수 있으므로 수학식에도 사용할 수 있다. >> v(3) ans = 9 >> v(3)=80; % 세 번째 원소의 값 변경 >> v(4)=v(3)/8+3 % 수학식을 이용한 네 번째 원소의 변경 v = 12 8 8013 28 2장 배열과 행렬
벡터 원소의 주소 지정 예 >> VCT=[35 46 78 23 5 14 81 3 55] VCT = 35 46 78 23 5 14 81 3 55 >> VCT(4) % 네 번째 원소를 출력함 ans = 23 >> VCT(6)=273 % 6 번째 원소에 새로운 값을 할당함 VCT= 35 46 78 23 5 273 81 3 55 >> VCT(2)+VCT(8) % 수학식에 벡터 원소를 사용함 ans = 49 >> VCT(5)^VCT(8)+sqrt(VCT(7)) ans = 134 2장 배열과 행렬
>> A = [5 10 9 8; 18 1 7 11; 29 14 3 6]; % 3x4 행렬을 생성함 >> A(3,1)=13 % 위치 (3,1)의 원소에 새로운 값을 할당함 A = 5 10 9 8 18 1 7 11 13 14 3 6 >> A(2,1) = A(2,1)-A(2,4) % 수학식에 원소를 사용함 A = 5 10 9 8 7 1 7 11 13 14 3 6 행렬 원소의 주소 지정 • 행렬원소의 주소는 원소가 있는 열(row)과 행(column)의 위치이다. 행렬 A에서 A(r, c)는 행렬 A의 r번째 열과 c번째 행에 위치한 원소를 나타낸다. • 행렬 A가 이면, A(1,1)=5, A(2,2)=1, A(3,3)=3이다. 2장 배열과 행렬
>> v=[10 20 30 40 50]; >> x=v(2:end) x = 20 30 40 50 >> y=v(2: length(v)) y = 20 30 40 50 >> v(3:end)=0 v = 10 20 0 0 0 >> v=[10 20 30 40 50]; >> v(3) ans =30 >> w=v(2:4) w = 20 30 40 >> length(v) ans = 5 콜론(:)을 이용한 벡터의 주소 지정(1/2) • 콜론을 이용하여 벡터나 행렬의 일정 범위의 원소들을 지정할 수 있다. • 벡터 v의 경우 v(:) : 벡터 v의 모든 원소를 열벡터로 나타낸다. v(m:n) : 벡터 v의 m 번째 원소에서 n 번째 원소까지의 원소들을 나타낸다. end는 벡터나 행렬의 마지막 원소의 주소를 나타내는 데 사용되며, 벡터의 경우 end는 명령어 length(벡터)의 실행 결과와 같은 값을 갖는다. 2장 배열과 행렬
>> v=[10 20 30 40 50]; >> w = v(3 :-1 : 1) % v(3), v(2), v(1) 원소를 가진 벡터 생성 w = 30 20 10 >> y=v(2:3:5) % v(2), v(5) 원소를 가진 벡터 생성 y = 20 50 >> z =v( [1 3 4] ) % v(1), v(3), v(4) 원소를 가진 벡터 생성 z = 10 30 40 >> vt=z( :) % 콜론에 의한 전체 원소의 선택은 전치와 동일 효과 vt = 10 30 40 콜론(:)을 이용한 벡터의 주소 지정(2/2) 2장 배열과 행렬
>> A =[2 4 13 9;16 3 7 11;8 21 6 5]; >> C = A(2:3, 1:3) C = 16 3 7 8 21 6 >> D=A(: , 2) >> E=A(1:2, :) D = 4 E = 3 2 4 13 9 21 16 3 7 11 콜론을 이용한 행렬의 주소 지정 (1/2) • 콜론을 이용하여 행렬 A의 일부 행이나 열을 지정할 수 있다. A( :, n)행렬 A의 n번째 열(column)의 모든 원소를 가리킴 A(n, : )행렬 A의 n번째 행(row)의 모든 원소를 가리킴 A(:, m:n)행렬 A의 m ~ n번째 열(column)의 모든 원소를 가리킴 A(m:n, :)행렬 A의 m ~ n번째 행(row)의 모든 원소를 가리킴 A(m:n, p:q)m ~ n번째 행과 p~q번째 열에 해당하는 원소를 가리킴 2장 배열과 행렬
행렬의 벡터 변환 >> B=[ 9:-2:1; zeros(1, 3) 1 2; ones(2, 5)*2 ] B = 975 3 1 0 0 0 1 2 2 2 2 2 2 2 2 2 2 2 >> B(:, end) = 1 B = 975 3 1 0 0 0 1 1 2 2 2 2 1 2 2 2 2 1 >> C= B( [1 3], [1, 3:4] ) C = 9 5 3 2 2 2 >> D=[11 12 13;21 22 23] D = 11 12 13 21 22 23 >> v =D(:) v = 11 21 12 22 13 23 >> v=v’ v = 11 21 12 22 13 23 콜른을 이용한 행렬의 주소 지정 (2/2) 2장 배열과 행렬
>> A=[2 4 10 13; 16 3 7 1;8 4 9 21] A = 2 4 10 13 16 3 7 1 8 4 9 21 >> indx = [1 2]; >> B = A(indx, indx) B = 2 4 16 3 >> v=[ A(3), A(4), A(7) ] v = 8 4 10 >> size(A), length(A) ans = 3 4 ans = 4 A(7)=A(1,3) A(10)=A(1,4) A(4)=A(1,2) length(A)는 max(size(A))와 같다. 행렬의 주소 지정 2장 배열과 행렬
>> DF=1:4% 벡터 DF를 4개의 원소로 정의함 DF = 1 2 3 4 >> DF(5:10)=10:5:35% 5 번째부터 시작하여 6개의 원소를 추가함 DF = 1 2 3 4 10 15 20 25 30 35 >> AD=[5 7 2]% 3개의 원소를 가진 벡터 AD를 정의함 AD = 5 7 2 >> AD(8)=4% 4 ~ 7 번째 원소가 0으로 자동 채워짐 AD = 5 7 2 0 0 0 0 4 >> v(4)=5 % 4번째 원소까지 0이 자동으로 채워짐 v = 0 0 0 0 5 벡터의 확장 및 축소 (1/2) • MATLAB에서는 변수를 벡터나 행렬로 미리 선언해 줄 필요가 없다. 즉, 스칼라 변수일지라도 벡터나 행렬로 확장할 수 있으며, 이미 만들어진 벡터나 행렬의 크기도 바꿀 수 있다. 2장 배열과 행렬
>> RE=[3 8 1 24]; >> GT=4:3:16; >> KNH = [RE GT] % RE와 GT를 붙여서 새로운 벡터 KNH를 정의함. KNH = 3 8 1 24 4 7 10 13 16 >> v=10 % v를 스칼라 변수로 지정 v = 10 >> v(end+1) = 20 % 스칼라 변수를 두 원소 벡터 변수로 확장 v = 10 20 >> v(end+1 : length(v)+3)=[3 4 5] % 5원소 벡터로 확장 v = 10 20 34 5 >> n = length(v) % 벡터의 길이(원소의 개수)를 확인한다 n= 5 >> v(n)=50 % 벡터의 마지막 원소를 50으로 대체한다. ans = 10 20 3 4 50 벡터의 확장 및 축소 (2/2) 2장 배열과 행렬
>> E=[1 2 3 4; 5 6 7 8]; E = 1 2 3 4 5 6 7 8 >> E(3, : )=[10:4:22] E = 1 2 3 4 5 6 7 8 10 14 18 22 >> K=eye(3); K = 1 0 0 0 1 0 0 0 1 >> G=[E K] % 행렬K를 행렬 E에 추가함. G = 1 2 3 4 1 0 0 5 6 7 8 0 1 0 10 14 18 22 0 0 1 벡터 [10 14 18 22]를 E의 셋째 행으로 추가함 >> E(3, 4)=1 E = 1 2 3 4 5 6 7 8 0 0 0 1 >> H(3,4)=8 H = 0 0 0 0 0 0 0 0 0 0 0 8 행렬의 확장 (1/2) • 기존 행렬에 새로운 행이나 열을 추가할 수 있는데, 이때 추가되는 행(열)의 길이는 기존 행렬과 맞아야 한다. 2장 배열과 행렬
(계속) >> A(:, 3:end)=[ ] % 원소 삭제 A = 11 12 21 22 31 32 >> A(2, 4) = 50 A = 11 12 0 0 21 22 0 50 31 32 0 0 >> clear; % 모든 변수 삭제 >> B(2,3) = 5 B = 0 0 0 0 0 5 >> A=[11 12 13 14;21 22 23 24] A = 11 12 13 14 21 22 23 24 >> A(3, :) = 31:34 A = 11 12 13 14 21 22 23 24 31 32 33 34 >> B=ones(3, 1); >> A=[A B] A = 11 12 13 14 1 21 22 23 24 1 31 32 33 34 1 행렬 크기를 벗어난 주소에 원소값을 지정하면 새 원소를 수용하기 위해 자동으로 행렬이 커지고 나머지 원소는 0으로 채워진다. 행렬의 확장 (2/2) 2장 배열과 행렬
>> v=[ ] % v를 공벡터로 지정 v = [ ] >> length(v) % 벡터 v의 원소 개수는? ans = 0 >> v=[1 3 100 5 7 200 300 400]; >> v(3)=[ ] v = 1 3 5 7 200 300 400 >> v( 5 : end)=[ ] v = 1 3 5 7 >> A=[5 11 4 9; 4 0 26 10; 56 1 5 89] A = 5 11 4 9 4 0 26 10 56 1 5 89 >> A(:, 2:3) = [] A = 5 9 4 10 56 89 벡터의 축소 • 공벡터(empty vector, null vector)는 원소가 없으며 [ ]로 표시한다. 벡터의 일부 원소에 공벡터를 할당하면 해당 원소가 삭제되는 효과를 갖는다. 이런 방법을 통해 벡터의 크기를 축소시킬 수 있다. 2장 배열과 행렬
이미 A가 22 행렬로 정의되어 있으므로 첫 번째 행의 원소를 13의row2로 대체하려고 하므로 크기가 다르다는 에러 발생. 행렬 정의시 주의할 점 • 스칼라 변수의 값을 정의하는 경우에는 이전에 변수가 미리 정의되어 있었더라도 새로운 값으로 대체가 되므로 문제가 없지만, 배열 변수의 경우에는 다음의 예와 같이 예기치 못한 문제가 생길 수 있으므로 이미 생성되어 있는 배열변수인지 확인하거나 clear 명령을 이용해서 이전의 모든 변수를 삭제하는 것이 좋다. >> A=[20, 30; 40, 50]; …… >> row1=11:14; >> A(1, :) =row1 Subscripted assignment dimension mismatch. >> clear A % 작업공간에 있는 A를 삭제한다. >> A(1, :) =row1 A = 11 12 13 14 2장 배열과 행렬
변수이름을 더블 클릭하면 Array Editor창이 열린다. 변수 이름을 바꿀 수도 있다. 배열 편집기(Array Editor) (1/2) • MATLAB의 Workspace Browser를 이용하여 작업공간내의 변수들을 쉽게 다룰 수 있다. Desktop 환경에서 Workspace Browser가 보이지 않으면, 명령창에서 >> workspace라고 입력하거나 Desktop의 Workspace 메뉴를 체크하면 된다. Workspace Browser에서 특정 변수의 이름을 바꾸거나 삭제할 수 있다. 2장 배열과 행렬
배열 편집기(Array Editor) (2/2) • Workspace Browser에서 변수를 더블 클릭하거나 메인 메뉴의 Array Editor를 체크하면 Array Editor 창이 열리며, 이 창에서 엑셀처럼 원소를 추가 입력함으로써 스칼라 변수를 배열로 변환시키거나, 배열 변수의 크기를 바꿀 수 있다. 2장 배열과 행렬
column page row 다차원 배열 • MATLAB 7은 다차원 배열을 지원한다. 예를 들어, mnq의 3차원의 배열을 다룰 수 있다. 3차원 배열은 각 페이지에 m n의 2차원 배열이 있는 것으로 생각할 수 있다.첫 페이지의 배열은 A(:, :, 1)로, 둘째 페이지의 배열은 A(:, :, 2), … 이런 식으로 모든 페이지의 배열을 볼 수 있다. 다차원 배열의 생성은 각 페이지별로 2차원 행렬을 입력하면 된다. >> A=[ 5 3 7; 2 9 4; 3 0 6]; >> A(:, :, 2)=[ 4 0 1; 9 2 8; 5 6 4] ansA(:,:,1) = 5 3 7 2 9 4 3 0 6 A(:,:,2) = 4 0 1 9 2 8 5 6 4 2장 배열과 행렬
다차원 배열의 주소 지정 >> P1=[ 5, 1, 7, -3; -1, 2, 6, 0; 8, 12, -4, 9]; >> P2=[ 4, 17, -1, 3; -9, 2, 8, 12; -6, 5, 7, 9]; >> A(:, :, 1)=P1; A(:, :, 2)=P2; >> A = cat(3, P1, P2); A(:,:,1) = 5 1 7 -3 -1 2 6 0 8 12 -4 9 A(:,:,2) = 4 17 -1 3 -9 2 8 12 -6 5 7 9 >> A(2, 2, 1) ans = 2 >> A(1, 2, 2)+A(2,4, 2) ans = 29 2장 배열과 행렬
벡터의 길이와 크기, 절대값 • length(v)는 벡터 v의 원소의 개수를 구해주며, 벡터의 크기(길이)는 로 sqrt(v*v')에 의해 구한다. abs(v)는 벡터 v의 각 원소의 절대값을 구해준다. • 예) v=[x1, x2, x3]일 때, length(v)=3, abs(v) = [ |x1|, |x2|, |x3| ], v의 크기는 sqrt(v*v’)로 구한다. • length(v)v가 벡터인 경우 벡터의 길이(원소의 개수)를 돌려준다. v가 mn의 행렬인 경우 m과 n 중에서 큰 값을 돌려준다. >> v=[2, -5, 4, -3]; n=length(v) ans = 4 >> A=[ 11 12 13 14; 21 22 23 24]; length(A) ans = 4 >> mag = sqrt(v*v’), abs_v= abs(v) ans = 7.3485 abs_v = 2 5 4 3 2장 배열과 행렬
cat(2, A, B) cat(3, A, B) cat(1, A, B) 행렬에 사용되는 내장함수 (1/8) • cat(dim, A, B, C, …) : 지정한 차원(dim)에 따라 배열을 연결한다. dim=1이면, 배열들을 밑으로 붙이고, dim=2이면 옆으로 붙인다. dim=3이면 3차원 방향으로 붙인다. cat(1, A, B)는 [A; B]와 같고, cat(2, A, B)는 [A, B]와 같다. • size(A)행렬 A의 크기가 mn이면, 행벡터로 [m, n]을 돌려준다. 사용법 : x=size(A), [m, n]=size(A), size(A, dimension) >> A=[11:14; 21:24; 31:34]; x=size(A) x = 3 4 >> [m, n]=size(A) m = 3 n = 4 2장 배열과 행렬
행렬에 사용되는 내장함수 (2/8) • diag(v) v가 벡터이면, v의 원소들을 대각선 원소로 갖는 정방행렬 (square matrix)을 생성한다. diag(A)A가 행렬이면, v의 대각선 원소로 구성된 벡터를 생성한다. >> v=[2, 5, 9]; A=diag(v)% 벡터가 대각선 원소인 행렬 생성 A = 2 0 0 0 5 0 0 0 9 >> diag(A) % 행렬 A의 대각선 원소를 뽑아 벡터로 생성 ans = 2 5 9 • sum(v)벡터 v의 모든 원소들의 합을 돌려준다. >> v=[5 3 9 2]; sum(v) ans = 19 2장 배열과 행렬
행렬에 사용되는 내장함수 (3/8) • sum(A) A가 행렬이면, A의 각 열(column)들을 벡터로 취급하여 합을 구하고 결과를 행벡터로 돌려준다. >> A=[1:2:5; 11:2:15; 21:2:25]; S=sum(A) A = 1 3 5 11 13 15 21 23 25 S = 33 39 45 >> sum(A, 1) % 각 열별로 원소를 더한다. sum(A)와 동일 ans = 33 39 45 >> sum(A, 2) % 각 행(row)별로 원소를 더한다. ans = 9 39 69 2장 배열과 행렬
행렬 A로부터 열을 따라 3개씩 취하여 새로운 크기의 행렬 C를 만들 때 열의 개수를 미리 계산할 필요없이 [ ] 표시를 입력하면 자동으로 계산된다. 행렬에 사용되는 내장함수 (4/8) • reshape(A, m, n) 행렬 A로부터 열(column)을 따라 원소를 취하여 mn의 행렬을 새로 만든다. A의 원소개수 가 mn 과 같지 않으면 에러가 발생한다. >> A=[1:3:10; 2:3:11; 3:3:12] A = 1 4 7 10 2 5 8 11 3 6 9 12 >> B = reshape(A, 2, 6) ans = 1 3 5 7 9 11 2 4 6 8 10 12 >> C = reshape(A, 3, [ ] ) C = 1 4 7 10 2 5 8 11 3 6 9 12 2장 배열과 행렬
행렬에 사용되는 내장함수 (5/8) • max(v) v가 벡터이면, v의 원소중에서 가장 큰 값을 돌려준다. • min(v)v가 벡터이면, v의 원소중에서 가장 작은 값을 돌려준다. >> v=randperm(5) v = 2 1 3 4 5 >> max(v) ans = 5 • max(A) 행렬 A의 각 열(column)에서의 최대값을 행벡터로 돌려줌. >> A = [6 2; -4 8; 3 10] A = 6 2 -4 8 3 10 >> max(A) ans = 6 10 2장 배열과 행렬
행렬에 사용되는 내장함수 (6/8) • sort(v) 벡터 v의 원소를 크기가 커지는 순으로 정렬하여 돌려준다. >> v=randperm(5) v = 5 4 1 2 3 >> sort(v) ans = 1 2 3 4 5 • sort(A) 행렬 A의 각 열(column)별로 크기가 커지는 순으로 정렬함. • sort(A, ‘descend’)A의 각 열별로 크기가 작아지는 순으로 정렬함. >> A=[3 9 1 5; 8 4 6 7; 5 7 3 4]; >> sort(A) >> sort(A, ‘descend’) ans = ans = 3 4 1 4 8 5 9 7 5 7 3 5 5 7 3 5 8 9 6 7 3 4 1 4 2장 배열과 행렬
행렬에 사용되는 내장함수 (7/8) • find(v) 벡터 v의 원소 중에서 0이 아닌 원소들의 주소를 돌려준다. >> x = [9 0 4 0 -3 0 2]; >> indx=find(x) indx = 1 3 5 7 • find(논리식)논리식을 만족시키는 원소들의 주소를 돌려준다. >> find(x > 2) ans = 1 3 >> x = [11 0 33 0 55]'; find(x) % find 결과도 열벡터 ans = 1 3 5 2장 배열과 행렬
행렬에 사용되는 내장함수 (8/8) • [r, c, v]=find(A) 행렬 A의 원소중에서 0이 아닌 원소들의 값은 v에, 주소는 행은 r에, 열은 c에 저장한다. >> A=[8 0 6; 0 2 4;3 7 0] A = 8 0 6 0 2 4 3 7 0 >> [r, c, v] = find(A); r=r’, c=c’, v= v’ r = 1 3 2 3 1 2 c = 1 1 2 2 3 3 v = 8 3 2 7 6 4 2장 배열과 행렬
첫 번째 방법 >> A(1:2,:)=zeros(2,5) A = 0 0 0 0 0 0 0 0 0 0 >> A(3:4,:)=ones(2,5) A = 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 • 두 번째 방법 >> A=[zeros(2,5); ones(2,5)] A = 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 예제 2.1 4x5의 행렬 생성 • ones 명령어와 zeros 명령어를 이용하여 첫 두 행은 0이고 다음 두 행은 1인 4×5 행렬을 생성하라. 2장 배열과 행렬
>> AR=zeros(6,6) AR = 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 0 0 0 0 0 0 0 0 0 0 0 >> AR(3:4,:)=ones(2,6) AR = 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 >> AR(:,3:4)=ones(6,2) AR = 0 0 1 1 0 0 0 0 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 0 0 0 0 1 1 0 0 예제 2.2 6x6의 행렬 생성 • 6×6 행렬에서 가운데 두 행과 가운데 두 열의 원소가 1이고 나머지 원소는 모두 0인 행렬을 생성하라. 2장 배열과 행렬
>> A=[ 2:3:17; 3:3:18; 4:3:19; 5:3:20; 6:3:21 ] A = 2 5 8 11 14 17 3 6 9 12 15 18 4 7 10 13 16 19 5 8 11 14 17 20 6 9 12 15 18 21 예제 2.3 행렬의 조작 (1/2) • 명령어 창에서 다음 세 배열A, B, v를 만들고, 명령어 한 개로A의 1번째 행과 3번째 행의 마지막 4개의 열을 B의 첫 두 행의 첫 네 열로 대체하라. 또 A의 4번째 행의 마지막 4개의 열을 v의 5~8번째 원소로 대체하라. 2장 배열과 행렬
>> B=[5:5:30; 30:5:55; 55:5:80 ] B= 5 10 15 20 25 30 30 35 40 45 50 55 55 60 65 70 75 80 >> v=[99:-1:91] v = 99 98 97 96 95 94 93 92 91 >> A([1 3 4 5], 3:6)=[ B([1 2], 1:4; v(5:8); B(3,2:5)] A = 2 5 5 10 15 20 3 6 9 12 15 18 4 7 30 35 40 45 5 8 95 94 93 92 6 9 60 65 70 75 >> 예제 2.3 행렬의 조작 (2/2) 2장 배열과 행렬
문자열(String) • 문자열은 따옴표로 묶은 문자들의 배열로서, 글자, 숫자, 기호와 공백 등을 포함할 수 있다. 예) 'class', 'te st', 'math%1', '{mech:05!}' • 작은따옴표를 문자열에 포함시키려면, 작은따옴표를 두 번 연달아 표시한다. 예) 'Mr. Hwang''s office' • 문자열을 입력을 위해 작은따옴표를 처음 표시하면 글자 색이 적갈색(maroon)으로 변하며, 마지막으로 작은따옴표를 입력하면 글자 색이 모두 자주색으로 변한다. • 문자열을 변수에 저장하면 각 글자에 해당하는 2바이트 코드가 숫자 배열처럼 저장되므로, 한 줄로 된 문자열은 글자(공백도 포함) 개수와 같은 원소 개수를 가진 행벡터처럼 취급된다. • MATLAB에서 문자열의 용도 예 : • 출력명령어(4장)에서 텍스트 메시지를 표시할 때 , plot 명령어에서 출력할 그래프의 형식을 지정할 때(5장), 함수의 입력인자(6장)에. • 그래프의 형식을 지정(축의 라벨, 제목, 설명문)할 때, 문자열 내의 문자들이 특정 폰트와 크기, 위치, 색을 갖도록 형식 지정을 할 수 있다. 2장 배열과 행렬
문자열 변수 (1/3) • 문자열은 문자열의 글자 개수와 같은 개수의 원소를 갖는 행벡터이며, 벡터의 주소 지정을 이용하여 각 원소에 접근할 수 있다. >> str='MATLAB is a high-performance language.‘ str = MATLAB is a high-performance language. >> size(str) % str은 공백을 포함하여 모두 38개의 글자를 가진 문자열임 ans = 1 38 >> name = str(1:6) % 수치 벡터처럼 다룰 수 있다. name = MATLAB >> str(1:6)= 'C++' ??? In an assignment A(:) = B, the number of elements in A and B must be the same. >> str(4:6)=[ ]; str(1:3)='C++' str = C++ is a high-performance language. 2장 배열과 행렬