본문 바로가기

🔧 Mechanical Engineering/mathematics🦄

(수치해석) Matlab(매트랩) 행렬생성,계산,명령어

728x90
반응형

Matlab 행렬의 기초와 관련 명령어를 정리해본다. Matlab이 Matrix Laboratory의 준말인거 이번학기 OT때 알았다. 그만큼 행렬계산에 특화된 닉값 제대로하는 프로그램이다. 

티스토리에 매트랩 코드블럭이 없어서 스크린샷으로 대체한다. 먼저 행렬생성이다. 띄어쓰기로 요소가 split된다. 파이썬은 쉼표로 구분하는데 매트랩은 공백으로 요소를 구분한다. 띄어쓰기를 통해 열바꿈을하고, 행바꿈을 하려면 땀흘리기 ;을 하면 행이 바꿔진다. 근데 행과 열이 헷갈린다. 이럴때 나는 '일렬로 선 사람들'을 생각한다. 일렬로 서라고했을때 우리는 세로로 길게 한줄을 선다. 그게 하나의 열이다.

행렬 a와 b를 생성했다면 두 행렬의 곱을 구할수있다. a*b는 110으로 정수값이 결과로나오고 b*a는 곱행렬이 결과로나온다. 암산해보면 대충 맞는거같다.

행렬생성 다른 예시. 공백과 땀으로 행렬의 크기를 조정하고 행렬곱 계산을 할수있다.

행렬의 요소를 호출해보자. 요소는 좌표값 혹은 위치값으로 호출할수있다. 

위치값은 위와같이 배정된다. 1열부터 1행2행.... 순서대로 위치값배정후 이어서 2열1행부터 배정된다. 즉 위 행렬에서 x(6)을 입력하면 5, x(7)을 입력해도 5가 출력된다. 두 5는 같은위치가 아니다. 위치값말고 좌표값으로도 행렬 요소를 호출할수있다. x(행번호, 열번호)이다. 즉 x(3,2)는 3행 2열인 5가 출력된다. 행, 열이라는 표현이 헷갈리면 그냥 직관적으로 세로방향으로 먼저 가서 가로방향으로 가는 상상을 하면된다.

 

몇몇 특수한 행렬을 명령어를 통해 생성할수있다. zeros와 ones 이 둘은 넘파이를 써봤다면 익숙할것이다. 파이썬의 넘파이 라이브러리에도 똑같은 명령어가 있는데 각각 영행렬과 일행렬(?)을 생성하는 명령어이다. (일행렬이라는 용어가 있는지 모르겠지만 대충 모든요소가 1인 행렬이다.) 구조는 zeros(행갯수, 열갯수), ones(행갯수, 열갯수)이다. magic은 마방진을 생성하는 명령어이다. 마방진은 가로,세로,대각선 요소의 합이 모두같은 행렬이다. 마방진은 정사각행렬이므로 그냥 크기 n만 입력하면된다. magic(4)를 입력하면 4x4크기의 마방진이 출력된다.

조금더 간편하게 숫자배열을 생성해보자. 1 : 0.6 : 3을 입력한다면 위와같이 출력된다. 이는 '1에서부터 0.6을 간격으로 숫자를 출력하되 3이하 숫자까지만 출력한다.' 라는 의미이다. 구조는 (시작점 : 간격 : 한계점) 이다. 여기서 중요한건 마지막 숫자인 3은 한계점이지, 끝점이 아니다. 즉, 정확히 3이 되지않더라도 종료된다는것이다. 위의 예시에서도 2.8에서 종료됐는데 그 이유는 다음 interval인 3.4는 한계점인 3을 넘기때문이다. 

만약 interval을 생략하면 자동으로 1이 배정된다. 아래 1:5는 시작점1, 한계점 5인데 interval이 입력되지않은 예시이다. 이땐 자동으로 간격이 1이되는것을 볼수있다.

interval은 음수가 될수있다. 음수일땐 감소하는 수 배열이 되는데 이때, interval이 음수일경우 반드시 시작점이 끝점보다 커야한다.  위에 비어있는 행백터가 출력되는 예시처럼, interval이 음수인데 7에서부터 13까지.. 라는 말도안되는 상황이나, interval을 입력하지않아 자동으로 1이 배정된 상태에서 7:2를 입력하는..(+1을 간격으로 7에서 2까지가는 상황) 이런 비현실적인 상황에선 행렬에 아무것도 입력이 안된다.

위와 비슷하지만 구체적인 명령어로 실행할수있다. linspace(시작값,끝값,요소갯수)의 구조이다. 위와달리 linspace는 interval을 계산할필요가 없다. 그냥 시작점, 끝점과 이 두점사이에 몇개의 요소를 넣을지만 결정되면 알아서 요소갯수에 맞춰 interval이 결정된다. 요소갯수가 생략될경우 기본값은 100이다. 위처럼 linspace(1,10)을 입력할경우 1부터 10까지 요소가 100개인 행렬이 생성된다. 이때 100개의 요소는 모두 같은 행이다. 줄바꿈이 되서 행이 여러개있는것처럼 보이지만 그냥 화면이 100개를 다 표시할만큼 길쭉하지않아서 줄바꿈된거일뿐.. 자세히보면 92~100번째 열 처럼 한개의 행에 100개의 열이 생성된것을 볼수있다.

위처럼 화면의 가로크기안에 하나의 행을 다 표현하기 힘들때가있다. 입력할때도 비슷한상황이 있을수있다. 코드가 가로로 너무 길어지면 읽기가 불편하다. 적절한점에서 줄바꿈을 해줘야하는데 행렬요소를 같은 행으로 계속 이어나가면서 줄바꿈을 할땐 ... 을 입력해주면된다. 점 3개? 4개도 된다. 암튼 요소끝에 점찍고 엔터치면 결과값은 한 행으로 스무스하게 나온다.

 

행렬안에 요소를 한꺼번에 쳐넣는거뿐만 아니라 요소를 각각 정의해주고 각 요소를 행렬에 삽입하는것도 가능하다 (당연하게도..) 각 x,y를 정의해주고 (뒤에 땀 ;을 붙여주는 이유는 매트랩은 엔터칠때마다 결과값이 출력되는데 그러면 명령창이 어지러워지므로 땀을 붙여준다. 땀이 붙으면 변수선언이나 수식,행렬등이 정의는되지만 바로바로 출력되는 현상은 없어진다.) 하나의 빈 행렬에 [x y]로 묶어주면 한 행짜리 행렬이 생성된다.

 

 행렬계산의 연장선(?) 행렬을 그냥 제곱해버리면 행렬곱으로 제곱이 계산된다. 만약 행렬을 요소별로 계산하고싶다면 x.^2와 같이 행렬뒤에 .을 붙이면 된다.  아래의 점을 붙인 결과값은 행렬곱이 아닌, 행렬을 요소별로 제곱한결과값이다.

반응형