IT

옥타브(Octave) 프로그래밍 튜토리얼 (1) - 기본 연산(Basic Operations)

유병혁 2015. 11. 20. 01:20

본 글은 코세라(Coursera)에서 제공되고 있는 스탠포트 대학교

머신러닝(Machine Learning)을 수강하면서 일부 내용을 정리한 것입니다.
강의 사이트: https://www.coursera.org/learn/machine-learning

 

옥타브 설치는 아래 글을 참조하시기 바랍니다.
수치계산을 위한 오픈소스 프로그래밍 언어 '옥타브(Octave)' 설치하기
http://blog.daum.net/geoscience/828

 

앞으로 총 7개의 옥타브 프로그래밍 튜토리얼을 글로 연재할 예정입니다.
그 첫번째로 기본 연산(Basic Operations) 기능들에 대해 살펴 보도록 하겠습니다.

 

일단, 옥타브를 GUI 방식으로 실행하고 기초 수학 연산(+, -, *, /)을 입력해 보겠습니다. 

>> 5+6
ans =  11
>> 3-2
ans =  1
>> 5*8
ans =  40
>> 1/2
ans =  0.50000
>> 2^6
ans =  64

 

이번에는 논리 연산(==, ~=, &&, ||, xor())을 입력해 보겠습니다.

A == B는 A와 B가 같다면 1, 아니면 0,

A ~= B는 A와 B가 같지 않다면 1, 아니면 0,

A && B는 AND 비트 연산으로 A와 B 모두 1일 때에만 1, 아니면 0,

A || B는 OR 비트 연산으로 A와 B 중 하나라도 1이 있다면 1, 아니면 0,

그리고 xor(A, B)는 XOR 비트 연산으로 A와 B가 다르면 1, 같으면 0이 되겠습니다.

>> 1 == 2
ans = 0
>> 1 ~= 2
ans =  1
>> 1 && 0
ans = 0
>> 1 || 0
ans =  1
>> xor(1, 0)
ans =  1

 

이번에는 옥타브 변수(variables)들에 대해 학습해 보겠습니다.

먼저, %는 옥타브에서 주석(comment)으로 사용되며, 세미콜론(;)은 값의 출력을 생략할 수 있습니다.

disp()는 값을 보여주는 함수, sprintf()는 문자열을 반환하는 출력 함수로써 아래와 같이 쓰일 수 있습니다.

format은 다양한 선택을 통해 값을 출력할 수 있는데요, 'help format'을 입력하시면 도움글을 확인하실 수 있습니다.

>> % Octave variables
>> a=3
a =  3
>> a=3;
>> a=pi;
>> disp(a)
 3.1416
>> disp(sprintf('2 decimals: %0.2f', a))
2 decimals: 3.14
>> disp(sprintf('2 decimals: %0.6f', a))
2 decimals: 3.141593
>> format long
>> a
a =  3.14159265358979
>> format short
>> a
a =  3.1416

 

자, 이제 행렬(matrix)에 대해 살펴 보도록 하겠습니다. 아래와 같이 3×2 행렬을 만들어 볼 수 있는데요,

>> A = [1 2; 3 4; 5 6]
A =
   1   2
   3   4
   5   6
>> A = [1 2;
3 4;
5 6]
A =
   1   2
   3   4
   5   6

 

아래와 같이 행 벡터(row vector)와 열 벡터(column vector)도 정의할 수 있습니다.

>> v = [1 2 3]
v =
   1   2   3
>> v = [1; 2; 3]
v =
   1
   2
   3

 

이번에는 1과 2 사이에 0.1 만큼 값을 증가시키며 만든 행 벡터인데요, 따로 값이 지정되어 있지 않으면 1만큼 증가합니다.

>> v = 1:0.1:2
v =
    1.0000    1.1000    1.2000    1.3000    1.4000    1.5000    1.6000    1.7000    1.8000    1.9000    2.0000
>> v = 1:6
v =
   1   2   3   4   5   6

 

자, 이번에는 값이 모두 1인 행렬을 만들고 각 값에 2만큼 곱해 보겠습니다. 앞서 학습한 행렬 정의와 결과가 같죠?!

>> ones(2, 3)
ans =
   1   1   1
   1   1   1
>> C = 2*ones(2, 3)
C =
   2   2   2
   2   2   2
>> C = [2 2 2; 2 2 2]
C =
   2   2   2
   2   2   2

 

한편, 임의 값을 가진 행렬을 만드는 함수로는 rand()와 randn()가 있는데요,

randn()는 평균이 0, 분산이 1인 가우시안 분포(Gaussian distribution) 값을 생성합니다.

>> w = ones(1, 3)
w =
   1   1   1
>> w = rand(1, 3)
w =
   0.021795   0.579260   0.683103
>> w= randn(1, 3)
w =
   0.076710  -1.024125  -0.924268

 

이번에는 아래와 같이 -6에 1과 10,000 사이에 임의 값과 10의 제곱근의 곱을 더해보도록 하겠습니다.

그리고 그 결과를 hist() 함수를 통해 표출해 보면 다음과 같습니다.

>> w = -6 + sqrt(10)*(randn(1, 10000)); >> hist(w) 

 

등간격 구간인 빈(bin)을 아래와 같이 50개로 조정할 수도 있습니다.

>> hist(w, 50)

 

끝으로 대각행렬(diagonal matrix)는 eye() 함수를 통해 정의할 수 있습니다. 간단하죠?!

아래와 같이 주대각선 상에 있지 않은 원소들이 모두 0인 정사각행렬을 쉽게 만들 수 있습니다.

>> eye(4)
ans =
Diagonal Matrix
   1   0   0   0
   0   1   0   0
   0   0   1   0
   0   0   0   1