고래밥 이야기
MATLAB Onramp_tutorial 본문
MATLAB tutorial 中 MATLAB Onramp을 참고하였다.
기본적인 모르는 게 있다면 천천히 추가하자!
기본 서식
데이터가 요렇게 있다고 가정하자.
- 작업 공간에 있는 변수들을 MATLAB 파일 형식인 MAT 파일로 저장할 수 있다.
ex) save apple -> apple.mat가 만들어 진다.
- 작업 공간에 있는 변수들을 제거할 수 있다.
ex) clear
- MAT 파일로부터 변수를 불러올 수 있다.
ex) load apple -> 작업공간에 apple.mat에 저장된 변수들이 불러와진다.
- 작업 공간에 있는 변수들은 이름만 치면 변수의 내용을 확인할 수 있다.
ex) data -> 명령 창에 data 내용이 나온다.
- 작업 공간이 아닌 명령 창의 내용을 몽땅 지울 수 있다.
ex) clc
- 일부 변수만 불러오거나 저장할 수 있다.
ex) load apple data -> apple이라는 파일 속에 data라는 변수만 불러온다는 것이다.
ex) save grape data -> grape라는 파일에 data라는 변수를 저장하겠다는 소리다.
- pi는 우리가 아는 그 파이로 내장되어 있다.
- 소수점을 길게, 혹은 짧게 할 수 있다.
ex) format long / format short
행렬
- 일정한 배열의 행 벡터는 쉽게 만들 수 있다.
ex) 1 3 5 는 1:2:5와 같다 (처음 : 간격 : 끝) - 간격만 아는 경우
ex) 1 3 5는 linspace(1,5,3) (처음 : 끝 : 갯수) - 갯수를 아는 경우
- default는 행벡터이지만 쉬운 방법으로 열벡터로 만들 수 있다.
ex) x = [1 3 5] -> x' =[1;3;5]
cf) 참고로 x = (1:2:5)' 이런 방법으로 하는 것도 가능함
+ 자주 쓰이는 함수
- rand(n)
ex) 0부터 1까지 사이에 있는 난수를 n*n 행렬로 출력한다.
- rand(n,m)
ex) 0부터 1까지 사이에 있는 난수를 n*m 행렬로 출력한다.
- zeros(n,m)
ex) 0을 n*m 행렬로 출력한다.
cf) 참고로 x가 2*3 행렬이라 가정하였을 때, size(x)는 [2 3]의 벡터를 출력한다. 이를 응용하여 rand(size(x))도 가능할 것이다.
- 행렬
ex) A(3,6)은 A 행렬의 3번째 행과 6번째 열에 있는 데이터를 뜻한다.
cf) 참고로 A[3,6]이 아님을 주의하자
ex) A(end,6)은 무엇일까? A 행렬의 마지막 행과 6번째 열에 있는 데이터를 뜻한다.
ex) 연산도 적용 가능하다. A(end-1,6)은 A 행렬의 마지막에서 두 번째 행을, 그리고 6번째 열에 있는 데이터를 뜻한다.
ex) A(5)은 어떻게 될까? 첫 번째 열에서 시작해서 아래의 방향으로 순환하게 된다. 즉 아래와 같은 그림대로 말이다.
ex) A(2,:)은 A의 2번째 행과 모든 열에 있는 데이터를 뜻한다. A(2:3,:)도 직관적이다!
cf) 개인적으로 matlab이 진짜 좋은 이유는 데이터 형태를 그대로 보존하는데 있다고 생각한다. 행을 짜르면 행이되고 열을 짜르면 열이된다. numpy와 R은 열 위주의 데이터로만 되었던것 같은데 말이다.
ex) 행렬과 마찬가지로 벡터 또한 굉장히 직관적이다. 가령 A가 1*6 벡터라면 A(3)은 3번째 데이터가 추출될 것이다. 또한 A의 3번째와 5번째 데이터를 추출하기 원한다면, A([3,5])를 넣을 것이다.
- 행렬의 계산
ex) vector + scalar하면 vector의 모든 원소에 scalar값이 더해진다. [1, 2] + 1 = [2, 3]이 된다. 곱하기 나누기도 마찬가지다.
ex) x가 vector라고 가정할 때, max(x)는 vector -> scalar로 가는 함수값이다. 반면, sqrt(x)와 round(x)같은 경우 vector -> vector로 가는 함수값이다. 예시로 max([1,3]) = 3 // round([1.2, 2.7]) = round([1, 3])이 된다.
cf) 만일 max(1,2;3,4)은 무엇이 나올까? [3,4]가 등장한다. 이를 통해 우리는 계산은 '열'의 기준으로 된다는 것을 확인할 수 있다.
ex) 행렬 곱셈은 *, 요소별 곱셈은 .*을 의미한다. 예시로
[1 2] * [3 4] 는 정의 되지 않는다. 왜? 행렬의 곱셈을 하기 위해서는 n*m / m*r의 형태만이 가능하기 때문이다.
[1 2] * [3 4]' 은 11을 출력할 것이다.
[1 2] .* [3 4]는 [3 8]을 출력할 것이다.
[1 2] .* [3 4]' 는 [3 6; 4 8]을 출력할 것이다. ** 주의하기, 헷갈리면 다음을 참고하도록 하자.
기본 연산에 대해 호환되는 배열 크기 - MATLAB & Simulink - MathWorks 한국
기본 연산에 대해 호환되는 배열 크기 - MATLAB & Simulink - MathWorks 한국
다음 MATLAB 명령에 해당하는 링크를 클릭했습니다. 명령을 실행하려면 MATLAB 명령 창에 입력하십시오. 웹 브라우저는 MATLAB 명령을 지원하지 않습니다.
kr.mathworks.com
cf) 위의 예시들을 종합해본다면,,
max([1 2;3 4]) + [1 2;3 4] 은 무엇이 나올까? 일단 max([1 2;3 4]) 은 '열'의 기준이 되기 때문에 [3 4]가 된다. 그리고 [3 4]와 [1 2;3 4]는 계산이 호환이 되기에 [4 6;6 8]이 될 것이다.
ex) A의 size가 3*7이면 [dr, dc] = size(A)라 한다면 dr dc에는 각각 3과 7이 할당된다.
ex) max함수는 [xMax, idx] = max(x) 이렇게도 적용이된다. mMax는 '열'의 기준으로 큰 값에 해당되며, idx은 해당 index를 뜻한다. 사실 이게 중요한 것이 아니라 [~, idx] = max(x)라는 표기가 핵심이다. 여기서 ~는 특정 출력값을 무시하겠다는 소리이다.
도움말
- 오른쪽 위에 있는 도움말 문서를 클릭한다면 해당 함수의 쓰임을 알 수 있다.
- 혹은 doc 함수를 통하여 해당 함수의 도움말 문서를 열 수 있다.
ex) doc randi
그림 그리기
- plot 함수를 이용하여 길이가 같은 두 개의 벡터를 x축, y축 좌표로 하는 그래프를 그릴 수 있다.
ex) plot(x,y)
cf) 참고로 plot(x,y, "r--o")와 같이 추가 효과를 부여할 수 있다. red / 선은 -- 모양 / 각 꼭지점은 o라는 소리다. 더 다양한 효과는 아래를 참고하길 바란다.
cf) 참고로 plot(y)를 쓰게 된다면 x축 데이터는 1부터 y의 벡터 크기로 지정된다.
cf) 참고로 plot(y, "LineWidth", 5)은 plot에 LineWidth가 5인 속성을 부여한 것이다.
cf) 참고로 이것도 가능하다. plot(x,y,"ro-","LineWidth",5) 그런데 여기서 든 의문, plot(x,y,"LineWidth",5,"ro-") 이건 작동할까? 결론부터 말하자면 작동이 되지 않는다. 사실 요런 것은 도움말에서 plot을 쳐보면 찬찬히 알 수 있다.
cf) 제목을 추가할 수 있다. title("helloww")와 같이 말이다. ylabel("y축이지렁")와 같은 y축 이름 추가 ,legend("Exp A", "Exp B")와 같은 범주 추가도 가능하다. (여기서 legend는 완벽히 상식적으로 작동한다. 두개의 plot이 덧붙여져 있으면 첫 번째가 Exp A로 두 번째가 Exp B로 저장된다.)
cf) 참고로 title같은 경우 title("he" + randn(1) + "llow") 도 가능하게 되어있다고 한다. 참고 바란다!
Specify Line and Marker Appearance in Plots - MATLAB & Simulink - MathWorks 한국
Specify Line and Marker Appearance in Plots - MATLAB & Simulink - MathWorks 한국
이 예제의 수정된 버전이 있습니다. 사용자가 편집한 내용을 반영하여 이 예제를 여시겠습니까?
kr.mathworks.com
차트 선의 모양과 동작 - MATLAB - MathWorks 한국
차트 선의 모양과 동작 - MATLAB - MathWorks 한국
R2020a부터는 UIContextMenu 속성을 설정하거나 가져오는 것이 권장되지 않습니다. ContextMenu 속성을 대신 사용하십시오. 이 속성은 동일한 유형의 입력값을 받고 UIContextMenu 속성과 같은 방식으로 동작
kr.mathworks.com
- plot 함수를 여러 번 쓴다면, 여러 개의 그래프가 생긴다. 이때 hold on 명령을 한 뒤 plot 함수를 입력하게 된다면, 이미 그려진 그래프 위에 덧붙여서 그려지게 된다.
ex) hold on
- 위의 hold on 명령을 없애고 다시 여러 개의 그래프를 그리고 싶다면, hold off 명령을 사용하면 된다.
ex) hold off
잡다한 알고리즘 비스무리
데이터가 요렇게 있다고 가정하자.
+ 변수
- 데이터의 변수를 쉽게 지정하는 방법이 있다.
ex) elements.Density
- 테이블 내에 새로운 변수를 만드는 쉬운 방법이 있다.
ex) elements.new = elements.Element .* elements.Density
- 테이블의 변수 간 오른 차순, 내림 차순으로 데이터를 정렬할 수 있으며, 이를 영구적으로 저장할 수 있다.
+ 논리연산자
- <, <=, >, >=, ==, ~= 가 있다. 굉장히 직관적이다.
- 행렬의 계산에서도 눈치 챘겠지만, matlab은 굉장히 직관적으로 계산을 한다. 이는 논리형 배열에서도 마찬가지이다.
ex) [5 10 12] > 1 = [0 0 0] 으로 나온다. 즉 벡터와 스칼라 간의 비교가 가능하다.
ex) 그렇다면 궁금해서 [2 4 2 4] < [1 1] 이런 식으로도 반복이 가능한지 확인해 보았다. 하지만 결과는 실패
ex) v1(v1>6) 이런 것은 직관적으로 무슨 뜻인지 알 것이다. v1 中 6보다 큰 숫자만을 뽑아 내겠다는 소리이다.
ex) and = & 이며 or은 | 이다.
+ 프로그래밍
- if문
ex) 양식은 이러하다. 참고로 elseif도 추가 가능하다.
- for문
ex) 양식은 이러하다. 이때 c = 1: length(vector) 요렇게 많이 쓰이는 편이다.