We will find a way. We always have.

고려대학교에서 인공지능과 금융공학을 연구하고 있는 어느 대학원생의 블로그입니다.

프로그래밍 언어(Programming Language)/매트랩(MATLAB)

[MATLAB] 2강 - 벡터와 행렬

MinsukSung 2020. 10. 19. 00:23

여기에서 정리하는 모든 내용은 고려대학교 문인식 교수님의 '뇌공학프로그래밍입문(INTRODUCTION TO PROGRAMMING FOR BRAIN AND COGNITIVE ENGINEERING)' 강의록을 정리한 내용입니다. 해당 내용에 대한 모든 저작권은 문인식 교수님께 있음을 확인하시길 바랍니다.


지난 시간까지는 MATLAB의 기본 문법에 대해서 알아보았습니다. 이번 시간에는 MATLAB으로 벡터와 벡터를 다루는 법에 대해서 간단하게 알아보도록 하겠습니다. 

 

 

1강 - MATLAB 설치 및 기초 문법

여기에서 정리하는 모든 내용은 고려대학교 문인식 교수님의 '뇌공학프로그래밍입문(INTRODUCTION TO PROGRAMMING FOR BRAIN AND COGNITIVE ENGINEERING)' 강의록을 정리한 내용입니다. 해당 내용에 대한 모든 저..

minsuksung-ai.tistory.com


행렬, 행 벡터, 열 벡터, 스칼라

한 슬라이드로 요약하자면 아래와 같이 나타낼 수 있습니다. 벡터의 경우 기본적으로 대괄호 [ ] 를 통해서 나타낼 수 있으며 스칼라의 경우 대괄호 없이 표현하면 됩니다. 설명을 위해서 차원(Dimension)이라던가 원소(Element)라던가 전체적인 큰 흐름을 이해하는데 다소 불필요한 개념을 생략하겠습니다. 

 


Creating Row Vectors

실제로 저도 C/C++과 Python을 하다가 왔지만 저처럼 다른 언어를 하시다가 오신 분들은 조금 문화 충격을 받으실 수 있는 부분입니다. 벡터를 이어붙이기(concat)하기 위해선 Python의 경우 extend와 같은 함수라던가 pandas 라이브러리를 사용할 경우엔 pd.concat([a,b])와 같이 이용해야만 했었는데, MATLAB의 경우 그냥 대괄호 [ ] 안에 넣어버리면 됩니다. 

 

 

실제로 위와 같이 대괄호 안에 변수를 넣어버리면 자연스럽게 이어집니다. 정말 당황스럽네요.


The Colon Operator

MATLAB에서는 콜론(:)을 어떻게 활용할까요? Python을 사용해보신 분들이라면 빠르게 이해하시고 넘어가실 수 있을겁니다. MATLAB에서는 아래와 같이 사용됩니다. 

 

first:last or first:step:last

 

처음 보신 분들을 위해서 아래와 같이 예제를 한번 보여드리겠습니다. 

 

 

2:6 과 같이 사용될 경우, 2에서 6까지 벡터를 생성하게 만들 수 있습니다. 1:2:9와 같이 사용될 경우, 중간에 들어가는 인자가 step수가 되어서 몇칸씩 띄어서 갈 것인지를 알려주게 됩니다. 여기에서 step은 항상 양수일 필요가 없고, 음수여도 동일하게 적용됨을 알 수 있습니다.


Functions linspace, logspace 

위와 같은 방법만으로 벡터를 생성할 수 있는 것은 아닙니다. MATLAB에서는 linspace라는 함수와 logspace라는 함수를 통해서도 벡터를 생성할 수 있습니다. 한번 예제를 보시죠.

 

 

위의 예제를 통해서 살펴보면 linspace는 4에서부터 7까지 총 3개의 포인트를 생성해줍니다. 그리고 logspace는 10씩 커지면서 10^2에서부터 10^4까지 3개의 포인트를 생성해줍니다. 어렵지 않게 사용하실 수 있을 겁니다.


Referring to Elements

벡터 안에 있는 원소를 어떻게 가져올 수 있을까요? 즉, MATLAB에서는 인덱싱(indexing)을 어떻게 할까요?

바로 소괄호 ( ) 를 통해서 인덱싱을 할 수 있습니다. C/C++ 혹은 Python을 사용하시는 분들은 정말 헷갈릴 수 있는데요. 보통의 경우 대괄호 [ ] 를 통해서 인덱싱했는데, MATLAB에서는 소괄호 ( ) 를 통해서 인덱싱해야합니다. 또한 여러 개를 가져오고 싶을 때는 소괄호 안에 중괄호를 넣어서 가져올 수 있습니다. 또한 가장 중요한 것 중 하나는 인덱스가 0이 아닌 1부터 시작한다는  점입니다. 한번 예제를 보시죠. 

 


Modifying Vectors 

벡터의 특정 원소의 값을 바꾸고 싶을 때는 어떻게 해야할까요? 앞서 배운 인덱싱을 통해서 가능합니다. 여러 개를 한꺼번에 바꿀 수 있습니다. 하지만 여기서 조심해야할 점은 존재하지 않는 인덱스의 값을 넣게 된다면, 그 사이의 모든 값은 0으로 채워질 겁니다. 

 


Column Vectors 

여기서 의미하는 Column Vectors란 m X 1 행렬을 의미합니다. 대괄호 안에 세미콜론(;)으로 값을 구분하거나 혹은 개행을 하여 만들 수 있습니다. 이렇게 만들어진 Column Vector를 Transpose하기 위해서는 간단하게 따옴표( ' ) 연산자를 통해서 Row Vector를 만들 수 있습니다.

 


Creating Matrix Variables & Functions that create matrices

그럼 행렬을 만들기 위해선 어떻게 해야할까요? 위에서 배운 걸 그대로 사용하면 됩니다. 앞서 벡터를 생성할 때 콜론(:)을 사용했으니 그것까지 응용해서 사용해봅시다. 

 

 

그리고 난수를 원소로 갖는 행렬을 생성하기 위해선 어떻게 해야할까요? 1강에서 공부했던 것처럼 rand 함수나 randi 함수를 통해서 생성할 수 있습니다. 또한 행렬의 모든 원소를 0이나 혹은 1로 만들고 싶다면 어떻게 해야할까요? 그럴 경우에는 zeros나 ones와 같은 함수를 사용하면 간단하게 만들 수 있습니다.

 


Matrix Elements

행렬을 인덱싱하기 위해선 벡터를 인덱싱했던 것과 마찬가지로 소괄호를 사용하면 됩니다. 소괄호로 인덱싱을 하면 작은 subset을 뽑아낼 수 있습니다. 그리고 앞서 배운 콜론(:) 연산자를 통해서 전체 행이나 전체 열을 다 가져올 수도 있습니다. 한번 살펴봅시다.

 


Dimensions

벡터나 행렬의 크기나 길이를 알기 위해선 어떻게 해야할까요? MATLAB에서는 length 함수를 통해서 전체 길이를 알 수 있고, size 라는 함수를 통해서 형태를 알 수 있습니다. 이 때 주의해야할 점은 length 는 항상 column 단위로 계산하기 때문에 전체 원소의 갯수가 아니라는 점을 명심하세요.

 


Changing dimensions

행렬의 차원에 건들기 위해선 어떻게 해야할까요? MATLAB에서는 기본적으로 아래와 같이 5가지 함수가 준비되어 있습니다. 각 행렬의 기능도 직관적으로 간단하게 정리해봤습니다. 

  • reshape: 행렬의 shape을 바꿔주는 함수
  • fliplr: 행렬의 좌(left)와 우(right)를 바꿔주는 함수
  • flipud: 행렬의 위(up)와 아래(down)을 바꿔주는 함수
  • rot90: 행렬을 90도 돌려주는 함수
  • repmat: 행렬을 그대로 복사해주는 함수

 

repmat 함수는 덩이리째로 복사해준다고 생각하시면 좋습니다. 아래의 예제를 보시면 2x2 행렬이 하나의 덩어리가 돼서 3x2 행렬을 만들게 됩니다. 

 

직관적으로 나타내면 아래와 같이 나타낼 수 있습니다.

 


Empty Vectors & Deleting elements from a vector or matrix 

행렬의 특정 원소를 삭제하고 싶으면 어떻게 해야할까요? 바로 Empty Vector를 만들면 됩니다. 방법은 간단합니다. 대괄호 [ ] 안에 아무 원소도 쓰지 않는 겁니다.

 

 

이러한 Empty Vector 를 통해서 우리는 행렬의 특정 원소를 제거할 수 있습니다. 

 


Useful Functions

MATLAB에서는 벡터와 행렬에서 기본적으로 사용될 수 있는 함수들이 있습니다. 한번 예제를 간단하게 살펴보시죠.

  • min 
  • max 
  • sum 
  • prod
  • cumprod 
  • cumsum

처음에는 min, max 예제를 확인해봅시다. 벡터일 경우는 스칼라값으로 결과가 나오지만, 행렬일 경우는 결과가 각각 Column Vector로 계산되기 때문에 각 Column에서의 min값과 max값이 나오게 됩니다. 이 점을 확인해주세요.  

 

 

이번에는 cum과 cumsum 예제입니다. 사실 앞선 예제와 같이 벡터와 행렬의 경우 각각 결과는 유사하게 나옵니다. 특히 행렬의 연산이 각 Column에서 이루어져서 결과가 나온다는 점을 기억해주세요.

 

마지막으로 prod와 cumprod의 예제입니다. 앞에서는 합이었다면 여기서는 곱입니다. 어렵지 않으니 추가 설명은 하지 않겠습니다.

 


여기까지 MATLAB에서 벡터와 행렬을 다루기 위한 내용을 정리해봤습니다. 생각보다 내용이 엄청 방대해서 정리하는데 시간이 매우 많이 걸렸네요. 사실 이외에도 추가할 내용이 훨씬 많습니다. 하지만 이 정도로만 정리해도 일단 벡터와 행렬을 다루시는데 어려움은 없으실 거라고 판단됩니다. 또한 Python에서의 NumPy를 조금 공부해보신 분들이라면 그래도 금방 익숙해지지 않을까 싶습니다. 글을 보시다가 이해가 안되시거나 궁금하신 내용은 언제나 댓글로 남겨주시면 최대한 도와드리겠습니다.


참고자료

 

 

행렬 생성, 결합, 확장하기 - MATLAB & Simulink - MathWorks 한국

귀하의 시스템에 이 예제의 수정된 버전이 있습니다. 이 버전을 대신 여시겠습니까?

kr.mathworks.com

 

 

행렬과 배열 - MATLAB & Simulink - MathWorks 한국

귀하의 시스템에 이 예제의 수정된 버전이 있습니다. 이 버전을 대신 여시겠습니까?

kr.mathworks.com