오랜만에 전기자동차공모전을 함께 준비해온 대학교 선배님께 연락을 드리고 만나서 많은 이야기를 나누었다.늘 그렇듯 학점 얘기와 함께 앞으로의 대학생활에 대비하기 위해 군대에 가기 전 이 시기에 무엇을 하면 좋을지 물었다.물론 군대 가기 전에는 놀라고 권하는 사람들이 많지만 알다시피 나는 헛되이 노는 게 서툴다. 안심하고 놀면 얼마나 좋을까, 하지만 항상 마음 한구석으로는 “이렇게 놀아도 될까?”라고 생각한다. 또 그렇다고 매일 집에 틀어박혀 공부만 하는 건 아닌데. 정말 특이한 것 같아. .
선배는 그런 마음을 이해하고 공감했다. 두 가지 프로그램을 재미있게 공부할 것을 추천했는데 매트랩(MATLAB)과 자바스크립트(Java Script)였다. 기계공학부 기준으로 CAD의 경우 3학년 2학기 전공에 들어가지만 매트랩은 따로 배우는 과목이 아니었다. 그런데 나중에 3학년이 되면 교수들이 과제물을 매트랩으로 제출해 달라고 할 때가 있단다. 이런 점에 대비해 매트랩을 배워야 하는 점도 있지만 두 번째 이유로는 매트랩이나 자바스크립트를 취미로 배워두면 나중에 다른 프로그램 언어를 접할 때 훨씬 쉬운 이유도 있다고 한다. 따라서 정리를 하게 되면 1. 학기 과제물을 MATLAB에서 제출해야 하는 상황인데, 2. MATLAB, Java Script 등을 공부하게 되면 이후의 다른 언어도 쉽게 할 수 있다.그런 이유로 공부를 해야 한다는 말을 듣고 유튜브에서 기초적인 것을 배운 뒤 이곳에서 복습 기록을 할 예정이다.

출처 : 공대생 필수 프로그램, 매트랩이 무엇인지 < Opinion < New <기사본문 – 코딩월드뉴스 (codingworldnews.com), 매트랩 (MATLAB), 공대생은 거의 들어본 적이 있는 프로그램으로 Matrix + Laboratary의 합성어라고 한다. 문제는, 나는 고등학교 1학년이나 대학교 1학년 때 줄을 배운 적이 없기 때문에, 아마 매트랩을 공부하는 과정에서 행렬의 기본적인 원리도 함께 배워야 할 것이다.
< 변수 지정, 연산자, 단순 기호 >

매트랩을 시작하면 고와 같은 창이 열리게 되며 크게 3개 영역으로 나뉜다.좌측 ‘현재 폴더’는 현재 이 매트랩 프로그램이 어느 폴더에 저장되어 있는지를 나타내며, 중앙 명령창(Command Window)은 실질적으로 코드를 입력하는 공간이 된다. 우측 작업공간은 명령창에서 변수를 지정하게 되면 작업공간으로 지정된 변수가 저장되는 공간이다.
명령 창을 보면 부등호 표시(>)가 나오는데 명령 창을 누르면 부등호 옆에 줄이 생기는데 이를 “명령 프롬프트(Command Prompt)”라고 부르며 이는 프로그램이 사용자의 입력을 받아들일 준비가 되어 있음을 나타내려고 한다.

기본적인 변수 지정과 연산자를 연습해 보았다. 이는 다른 R언어에서처럼 등호(=)를 사용하여 지정할 수 있었다. 위와 같이 한글 변수가 매트랩이 지원해주지 않는 이유인지는 모르겠지만 변수 지정이 불가능하고, 추가로 숫자 또는 _ 기호가 맨 앞에 위치한 이름의 변수도 지정되어 있지 않다. (예를 들어 ‘3a’, ‘_d’ 등) 이는 R 언어에서의 법칙과 동일했다.(여담에서, R 언어에서는 변수 지정을 함에 있어서 등호 대신에 「<-」도 사용할 수 있었지만, 매트랩에서는 불가능했다) 연산자는 다른 언어와 다를 것이 전혀 없었다.

매트랩에서 세미콜론( ; )의 특징은 명령창에는 결과를 표시하지 않지만 작업공간에는 보존해 두는 것을 알 수 있었다.
또한 “ans”는 결과값을 answer의 약자로 의미하며 명령창에 “clc”를 입력함으로써 명령창의 코드를 모두 지울 수도 있었다. (작업공간 변수는 따로 지우지 않는한 저장됨)
<Command Window 이용방법> 예제를 사용하여 연습해 보자.(예제출처 : 7시간으로 배우는 MATLAB 기초(Part1)-YouTube) * 1, 2, 3을 원소로 갖는 1행 3열 행렬 b 생성 * 3행 1열 행렬 c 생성 * 행렬 b를 d에 대입 * 행렬 b의 전치(transpose) 행렬을 행렬 e에 대입)

첫째 행렬은 대괄고'[]를 사용한다.또한 행렬 내에는 숫자 간 띄어쓰기가 필수적이다.(만약 g=[123]이라고 입력하면 크기 1 x 1 의 행렬이 출력된다.)
위와 같이 b= [1 2 3] 명령을 통해 크기 1×3(1행 3열) 행렬이 생성됨을 알 수 있다.그렇다면 반대로 3행 1열과 같은 여러 행의 행렬을 만들고 싶다면 어떻게 해야 하는가? 그림에서 보듯이 세미콜론을 이용하면 원소끼리 ‘개행’을 해서 여러 행의 벡터를 생성할 수 있다.
b라고 하는 이름의 행렬을 d에 대입하기 위해서는 d=b로 입력해야 하는 것을 기억하자.R언어에서는 등호 대신에 ‘<-‘기호를 사용할 수 있다고 했지만, d=b를 d<-b로 이해하면, “b를 d에 대입한다”로 이해할 수 있다.
전치(transpose) 행렬은 특정 행렬의 행과 열을 나눈 행렬을 말하는데, 위에서 볼 수 있듯이 1행 3열의 전치 행렬은 3행 1열의 행렬임을 알 수 있다.이때 행렬 내의 원소는 변하지 않는다.생성법은 오포스톨로피를 사용하여 끌어낼 수 있다.
예제에서 “(복습) 명령창에 값을 출력하지 않으려면?” 답은 이것으로 말했듯이 세미콜론을 마지막으로 달아주면 된다고 했다.따라서 우리는 메트렙 내에서 세미콜론의 두 가지 기능을 상기시킬 수 있을 것이다.1. 명령창에 결과값을 출력하지 않기 위한 기능(행렬 외) 2.행렬 내에서 줄바꿈을 하기 위한 기능(행렬 내)의 두 번째 예시를 보도록 하자.*1~6의 원소를 순서대로 가지는 2행 3열의 행렬 d 생성 *행렬 d의 1행 3열의 원소의 가격 출력 *2제곱 3의 계산치 출력.마지막으로 계산된 answer 값 출력.마지막으로 계산된 answer 값에 10을 더한 가격 출력*행렬 b의 각 원소에 제곱값 출력*행렬 a=[1 2 3], b=[7 8 9]일 때 a와 b의 각 원소의 곱 출력


1에서 6까지의 원소가 포함된 2행 3열의 벡터를 생성하기 위해서는 2행을 위한 세미콜론이 필요하다는 것을 알 수 있다.따라서 1에서 3까지는 원소 간 띄어쓰기만, 3에서 4로 갈 때는 세미콜론을, 이후 4에서 6까지는 띄어쓰기만 하면 위와 같은 조건의 행렬을 생성할 수 있게 된다. ( d = [ 1 2 3 ; 4 5 6 ] )
행렬 d에서 1행 3열의 원소인 3만을 끌어내고 싶다면 어떻게 해야 할까.이는 행렬명 + 소괄호 ( )의 조합으로 이용할 수 있는데, d(1, 3)를 입력하면 1행 3열의 원소인 3만이 결과값으로 도출된다.
위에서 ‘ans’는 answer의 약자임을 확인하였는데, ans도 사칙연산 또는 다른 연산자로 ‘변수처럼’ 사용할 수 있다.* 단 ans 을 자주 사용하지 말 것을 권장하지만, 그 이유는 수시로 바뀌는 값이기도 하므로 혼동하기 쉽기 때문이다.
행렬 b= [1; 2; 3] 라고 할 때 행렬의 각 원소의 제곱 행렬은 어떻게 도출될 수 있는가?직관적으로 생각하면, b^2라고 생각할 수 있다. 하지만 입력해보는건 어때? 위에서 볼 수 있듯이 에러가 난다.이것을 해결하기 위해서는 연산자 앞에 「.」를 누르면 된다. 따라서 b.^2를 하면 b행렬의 각 원소의 제곱행렬이 도출된다.
위와 같은 개념으로 a행렬과 b행렬 각각의 원소의 곱의 행렬을 도출하기 위해서는 단순히 a*b가 아니라 a.*b로 나타낼 수 있다.이때 행렬의 각 원소의 곱은 행렬의 크기가 달라도 모두 계산된다. (사실 이에 대한 사실은 코딩보다는 수학 그 자체에 가깝다) * 참고로 행렬의 각 원소의 곱을 ‘아다마르 곱’이라고 한다.** 매트랩 때문에 행렬을 대충 알아보다가 알게 되었는데, 행렬의 곱의 법칙상 행 x 행(?)이 아닌 행 x 열의 형태로 곱하기 a*b에 오류가 생긴 것을 확인할 수 있었다.
세 번째 예를 들어보자 * 행렬 a 와 b 의 내적값 출력 * 3 행 3 열을 가진 영 행렬 (Zero Matrix) 출력 * 1 행 3 열을 가진 영 행렬 출력 * 3 행 3 열의 단위 행렬 (Unit Matrix) 출력 * 모든 원소값이 1 인 3 행 3 열의 행렬 출력 * A = = =



행렬 a와 b의 내적값은 어떻게 구할 수 있을까.우선, 내적은 벡터의 내적을 의미하고, 벡터 u와 v가 있다고 했을 때, u와 v의 내적은 이라고 나타낼 수 있었다. 이 때 행렬 곱의 특징을 이용하여 벡터의 내적을 나타낼 수 있는데,

출처 : [#3]경제수학, 행렬; 행 줄과 행렬 연산 : 네이버 블로그(naver.com)가 특성을 이용하면 b 행렬은 줄의 행렬도 바뀌어야 함을 알 수 있다.따라서 b 행렬은 전치 행렬을 적용하여야 하며, 그 후에 두 행렬의 곱으로 스칼라 값을 도출할 수 있다.따라서 “a*b” 로 나타낼 수 있다.
3행 3열의 영행렬(Zero Matrix)이란 3행 3열의 행렬에서 원소가 모두 0으로 이루어진 행렬을 뜻하는데, 앞서 배운 것을 바탕으로 [00;00;00]을 입력해도 되지만 보다 쉽게 zeros()라는 함수를 이용할 수 있다.zeros(3, 3) 앞에서 배운 d(1, 3)와 비슷한 원리로 3행 3열의 영행렬을 생성한다는 뜻이다.이 때, 3행 3열, 2행 2열과 같이 행과 열의 값이 같으면, 각각 3, 2만 괄호 안에 쓰면 용이하게 동일한 행과 열의 행렬을 생성할 수 있다(zeros(3))
이를 이용하여 1행 3열의 영행렬을 zeros(1, 3)을 통해 만들 수 있다.
3행 3열의 단위행렬(Unit Matrix)은 어떻게 만들 수 있을까?먼저 단위행렬은 행렬 내 주 대각선이 1로만, 나머지는 0으로 구성된 행렬을 말한다.생성 방법은 eye() 함수를 사용하면 되는데, 3행 3열의 단위 행렬을 만들기 위해서는 eye(3, 3) 또는 eye(3)를 입력하면 된다.
모든 원소의 값이 1인 1행 3열의 행렬을 만들려면 어떻게 해야 할까?모든 원소값이 0인 행렬을 만들기 위해서는 글자 그대로 zeros() 함수를 사용했다.모든 원소값이 1인 행렬을 만들기 위해서도 매우 직관적으로, ones() 함수를 사용하면 된다.따라서 ones(1, 3) 를 입력하면 된다.
A = [12 3 3 5 6 7 8 9]라고 하는 3행 3열의 행렬이 존재할 때 sum(A)을 입력하면 어떤 결과가 나오는가?매트랩은 기본적으로 열로부터 계산값을 도출한다.A행렬로부터 열을 중심으로 계산하게 되면, 결과는 새로운 행렬인 [121518]이 도출될 것이다.
그러면, sum(A))는 어떤 결과를 나타내는 것일까.10부터 계산이 끝나면 그때서야 행을 계산하게 될 것이다.따라서, 결과치는 12+15+18의 45가 된다.
A의 최대값/최소값은 문자 그대로다.max() 함수와 min() 함수를 이용하여 도출할 수 있는데, 각각의 ‘열’로부터 최대(최소)의 것만 골라내어 한 줄의 행렬을 만들어 낸다.예를 들어 라고 하는 행렬이 있다고 할 때, max() 함수를 이용한 결과값은 [3317]이 될 것이다. (min) 함수도 이와 같은 원리이고
그러면 max(A))는 어떠한 결과를 초래하는가?우선 max(A)는 [789]가 될 것이다. 보기에 따라서는 sum(A)에서 열에서 계산한 후행을 계산한 것처럼 max(혹은 min) 함수도 열에서 처리한 후행을 처리하는 메커니즘과 비슷하다고 할 수 있다.따라서 max(max(A))는 9가 된다. 당연히 min(A))은 1이 될 것이고.
네 번째 예를 보자.* A = [12;34], B = [56;78] 일 때 A 행렬과 B 행렬의 각 원소의 합/차출력* 행렬 A의 크기를 알 수 있는 방법은?* 행과 열의 크기 중 큰 값을 알 수 있는 방법은? * A * B와 A. * B의 차이는? * C = [11 1; 22 2; 33 3]일 때, 두 줄의 값 전체를 출력하는 방법은? (3개)*1.6 소수치를 round / floor / ceil 로 적용하면?



행렬의 연산을 하면서 느낀 것은 왜 행렬과 벡터가 비슷한 부류인지 알 수 있었다.벡터의 합과 차의 성질이 사실상 행렬의 합과 수레와 같으며, 벡터의 곱(외적, 내적)이 행렬의 곱 개념과 느낌이 유사했다.수학 벌레가 아니라 수학적 유사성까지는 모른다
벡터의 합이 각각의 n번째 원소끼리의 합과 같았듯이 행렬에서의 합과 차이도 각각의 m번째 원소끼리의 합으로 나오게 된다.따라서 A행렬과 B행렬의 합은 각 순서의 원소의 합[68;1012]으로 나오게 된다.행렬 사이의 차이도 동일한 원리로 계산되어 도출될 것이다.
특정한 행렬의 크기를 알기 위해서는 또한 직관적으로 행렬의 크기와 관련이 있을 것으로 생각할 수 있다.매트랩의 장점은 함수의 이름이 너무 직감적인 것 같아 설마 size를 쓸 줄 알았는데 정말 함수 이름이 size였어어쨌든 size() 함수를 사용하면 행렬이 몇 x 몇 개인지 알려주는데, 예를 들어 A=[12;34] 행렬을 이용하여 size(A)를 입력하면 그림과 같은 결과가 나오는데, 결과값의 의미는 ‘2’행’2’열을 의미하게 된다.
행과 열의 크기 중 가장 큰 값을 알아내는 방법은 무엇일까.예를 들어 2행 3열의 행렬이 있다고 가정할 때 가장 큰 값은 바로 3일 것이다.이때 사용하는 함수가 length() 함수이다. C=[13;456] 행렬이 있다고 할 때, length(C)를 사용하면 결과값이 3이 나오게 된다.
A*B와 A.*B의 차이는 상술한 바와 같이 복습한다고 생각하면 되지만, A*B는 상기의 참고자료에서 본 것처럼 행렬의 곱의 원리에 의해 결과값이 도출되게 된다. (첫 번째 행렬의 행 X 두 번째 행렬의 줄 느낌) * 단, 역은 성립하지 않는다.A.*B는 각 원소끼리의 곱이 도출된다는 것을 앞에서 알 수 있었다.
A= [1 1 ; 2 2 ; 3 3 3 ] 이라고 하는 행렬이 있을 때, 2행 전체를 ‘고르는 방법’ 은 앞 d행렬의 1행 3열 값을 고르는 개념인 것 같다.이때 2행 전체를 선택해야 하는데, 행렬에서 볼 수 있듯이 삼열이 존재하기 때문에 이를 고려하여 세 가지 방법으로 나타내면 1.A(2, 1:3) <–“A행렬의 ‘2행’ ‘1~3열’을 도출합니다.”2. A(2, 1:end) <–” A행렬의 ‘2행’, ‘1~굿열’을 도출합니다.” 3. A(2, 🙂 <–“A 행렬의 ‘2줄’, ‘열 전체’를 도출합니다.”보시다시피 아래로 내려감에 따라 코드가 단순해지는 것을 알 수 있다.
코딩을 하게 되면 이런 식으로든 저런 방법으로든 코드를 잡을 수 있지만 어떤 것이 더 효율적인 방법인지는 코드를 짜는 사람의 판단에 따라 다를 것이다. 같은 결과치를 도출하는 과정에서 방법은 여러 가지가 있고, 무엇이 더 효율적인지 판단하고 깨끗한 코딩을 하는 사람이 코딩을 잘 하는 사람이라고 볼 수 있을 것 같다.
1.6, 소수의 값을 각각의 함수들을 이용하여 결과값을 확인해 보자.1. round 함수는 ‘반올림’이라는 뜻이고 1.6을 반올림하면 2가 나오게 될 것이다.2. floor 함수는 ‘바닥’이라는 의미대로 1~1.6~2를 하나의 ‘층’으로 표현하면 바닥으로 내려가도록 하므로 1이라는 결과값이 나오게 된다.3. ceil 함수는 반대로 ‘천장’이라는 의미대로 위로 올라가기로 하고 2라는 결과값을 낸다.마지막 예제를 보도록 하자.*x=[1 2 3 4 5];, y=[5 4 3 2 1];일 경우, 단순x <y를 출력한 값은?*x <y일 때 x값 출력*whos를 입력해 보자.


x=[1 2 3 4 5], y=[5 4 3 2 1] 인 행렬이 있다고 했을 때, x < y 를 입력하면 logical 배열의 행렬이 도출된다.logical 배열의 행렬은 논리연산자인 0과 1만으로 이루어지는 행렬로, 이미 0은 FALSE(거짓), 1은 TRUE(참)를 나타내고 있다.x행렬과 y행렬의 크기를 비교할 때 x <y조건을 만족하는 부분은 1의 원소를, 거짓에 해당하는 부분은 0의 원소를 갖게 된다.
그러면 x<y의 조건을 ‘만족하는’ x의 원소만을 추출하고 싶다면?d행렬에서의 한줄 세줄을 치고 싶을 때, 우리는 매트랩의 언어로 d(1,3)라고 표현했다.이와 유사한 x(x < y)는 “x < y를 만족하는 x의 원소를 도출합니다.”라고 이해할 수 있다.
whos를 입력하면 그림에서 볼 수 있듯이 작업공간에 존재하는 다양한 변수의 정보를 보여준다.이때 double은 무엇을 의미하는 것일까? -> double은 매트랩에서 기본값으로 사용하는 자료형이고 매트랩은 double 자료형 외에 single, int8, int16, unit8, unit16 등의 다양한 자료형을 사용하지만 double은 대부분의 실수를 표현할 수 있지만 다른 자료형이라고 하는 가장 느린 속도의 변환을 할 때 가장 느린 자료형이라고 하는 다른 자료형이라고 하는 변환을 할 수 있다.