본문 바로가기

🔧 Mechanical Engineering/mathematics🦄

(수치해석) Matlab(매트랩) 전치행렬, 난수행렬, 데이터 시각화

728x90
반응형

지난번에 정리한 내용中..  :혹은 linspace를 이용하면 범위내 숫자 간격 혹은 갯수만으로 한 행에 숫자배열을 쭉 늘어놓을수 있다고했다. 근데 만약.. 한 행이 아닌 한 열에 늘어놓고싶다면? 이때는 생성한 1행 행렬의 전치행렬을 구하면된다.

이런식으로. x=1:3을 입력한다면 간격은 자동으로 1이 배정되어 한 행에 [1 2 3] 행렬이 생성된다. 이때 x'처럼 어퍼스트로피(?)를 붙여주면 행과 열이 바뀐다. 전치행렬의 가장 일반적인 표기는 xT와 같이 뒤에 대문자 T를 붙이는건데 x'처럼 어퍼스트로피 붙이는것도 실제로 있는 표기이다. 전치행렬을 사용하는 경우는 많으므로 혹시라도 처음부터 손으로 다 입력하지말고 그냥 원래 행렬에 ' 하나 붙여서 간단히 생성하자

rand는 난수행렬 생성 명령어다. rand(행갯수,열갯수) 형식이다. rand(2,3)을 입력하면 2x3크기의 0~1사이 난수로 이루어진 행렬이 생성된다. rand 아래에있는 randi는 조금 다른 형태이다. 특징을보면 결과값이 정수형난수라는 것이다. 난수를 정수로 생성할때는 randi를 이용한다. randi(최댓값,행갯수,열갯수)형식이다. 이때 최솟값은 자동으로 1이 배정된다. randi(10,3,4)는 '1부터 10까지 정수형난수로 3x4크기의 행렬을 생성'하라는 명령이다.

위에서와 같이 3x3행렬중 한 행 또는 한 열을 통째로 생성하고싶을땐 ':'을 입력한다. x(2,:)'행렬 x 2행의 모든 열을 출력한다'는 의미이다. :로 범위도 지정해줄수있다. x(2,2:3) '행렬 x 2행의 2-3열을 출력한다'는 의미이다. end는 가장 마지막 행/열을 의미한다. x(end,1)'행렬x 가장 마지막행의 1열을 출력한다'는 의미다. end-1은 마지막에서 두번째 요소를 의미한다. 

저번에 말한 행렬의 위치값 찾기 기능을 이용해 행렬 요소값을 변경할수있다. 위와같은 3x3행렬에서 위치값 4인 x(4)는 2이다. 1열부터 차례로 위치값이 할당되기때문이다. 이때 x(4)=52라고 대입해버리면 x(4)자리에 2 대신 52가 출력된다. 이런식으로 위치값을 이용해 행렬의 요소를 바꿀수있다. 암튼 이런식으로 행렬 x가 생성되었다. 이때 x+1 연산자를 입력하면 뭐가 출력될까? 이땐 행렬 x의 모든요소에 1이 더해진 행렬이 출력된다. 지난번에 행렬의 요소별 계산을 할때 들던 예시가 x.^2였다. 뒤에 점을 붙인이유는 행렬곱과 요소곱의 구분을 위해서이다. 그러나 상수와의 단순 사칙연산은 행렬곱 개념이 따로 필요없기때문에 그냥 x+2, x*2등과 같이 계산해도 알아서 요소계산결과가 출력된다.

이제 데이터 시각화를 해보자. x,y 간단히 데이터 세팅을 해두고 plot(x,y)를 입력하면 아래와같은 플롯이 그려진다.

입력한 데이터 x,y의 플롯이다. plot(x축 변수, y축 변수)의 형태이다. 그럼 여기서.. 만약 3차원 플롯을 그리고싶다면? 그땐 plot3 함수를 이용하는데 그건 나중에 알아보자. plot은 2차원전용 함수이다. 그럼 위에서 x,y배열을 생성했는데, 만약 x배열을 생성하지않고 plot(y)처럼 입력해버리면 어떤 결과가 출력될까? 이땐 x축에는 자동으로 y의 인덱스값이 할당된다. 예를들어 y=[10,20,30...]에서 10의 인덱스는 1, 20의 인덱스는 2... 이런식이므로 결과적으로 x축엔 1,2,3,4..가 자동 할당된다. 의도치않게 원래 플롯이랑 똑같은 플롯이 그려지겠다.

근데 정확히 말하면 위의 데이터는 일직선이 아니다. (1,10),(2,20)..과 같은 10개의 점을 찍어둬서 그 사이는 보간법으로 그냥 메꿔버린 직선이다. 직선으로 그은것이 아니라 산점도를 보고싶다면? 플롯의 모양을 지정할수있다. plot(x,y,"ro")라고 입력되어있는데 이것은 r(red, 빨간색의)o(o모양으로 데이터를 표현한다)는 의미이다. 앞에있는 알파벳은 플롯의 색을 의미하고 뒤에 o는 무슨 의미가 있는 알파벳이 아닌, 그냥 플롯의 모양을 의미하는거다. 만약 "r--"을 입력했다면 빨간색 점선이 출력될것이다.

위의 출력결과이다. 말그대로 red-o모양의 플롯이 출력됐다. 

플로팅을 응용해보자. 공식을보면 대충 무슨상황인지 알것같다. 포물선운동 궤적을 그리는 예제이다. 이 코드를 보며 플로팅 기술을 익혀보자. 위에는 그냥 변수선언, x,y 식을 세운것이다. plot(t,y)는 시간(t)에 대한 y(변위)궤적을 그리는데 이때 아래부터 title은 플롯 상단 제목, xlabel, ylabel은 각각 x,y축의 축제목을 입력하는 함수이다. grid는 표에 격자를 표시하는 명령어, hold on은 표를 겹치는 명령어다. plot을 그리고 hold on을 입력하면 hold on아래로 그려지는 추가 plot들은 처음 plot위에 계속 겹쳐지면서 그려진다. 만약 그만 겹치고싶다면 hold off를 입력해주면 된다. 위 코드의 경우 plot(t,y); hold on plot(t,x)가 입력되었으므로 plot(t,y)와 plot(t,x)가 겹쳐진채로 그려질것이다. legend는 범례표시이다. 그래프의 우측상단에 겹쳐진 각 그래프가 어떤 변수를 의미하는지 표시해주는 기능이다. 마지막줄 ylim은 y축의 범위를 지정해주는 기능이다. ylim([0,140])은 y축이 0부터 140까지 값을 갖는다는 의미이다.

위의 코드를 돌렸을때 출력되는 플롯이다. 파이썬의 numpy로 플롯그리는것과 형식이 꽤 비슷하다.

 

반응형