A/D변환기 (Analog-to-Digital Converter)란 아날로그 전압을 디지털 값으로 변화시켜주는 장치로서 ATmega8(A)는 10비트 분해능의 A/D변환기를 내장하고 있다. 개략적으로 설명하면 변환하는 전압의 범위가 0~5V일 때 입력핀의 전압이 0V이면 0x000, 5V이면 0x3FF (0b11.1111.1111), 2.5V이면 0x1FF와 같이 연속적인 전압을 불연속적인 2진 숫자로 바꾸어주는 장치가 A/D변환기이다.


[그림 1] ATmega8(A) 의 ADC 내부 구조도


A/D변환기는 보다 안정된 동작을 위하여 AVR의 시스템 전원과 별도로 아날로그 회로의 전원핀 AVCC가 있으며 A/D변환에 필요한 기준 전압을 인가하는 AREF핀도 가지고 있다. 단, AVCC의 전압은 VCC에 인가되는 전압의 ±0.3V 이내로 유지되어야 한다. 이를 위해서 dateasheet에는 다음과 같은  간단한 LC 필터를 AVCC에 연결하도록 권장된다.


[그림 2] AVCC에 연결되는 LC필터


변환되는 전압의 최소값은 GND이며, 최대값은 AVCC/AREF/2.56V(내부 발생) 세 가지 중에서 선택적으로 설정할 수 있다.


[그림 2] ADC와 관련된 핀들


A/D 변환 핀은 PDIP패키지의 경우 ADC0~ADC5로 6개가 있으며 SFR의 설정에 따라 이들 중 하나의 핀을 선택하여 A/D 변환을 수행하게 된다. 단일 변환 시간은 13~250us이다.


 A/D변환 모드는 단일 변환 모드 (single conversion mode)와 연속 변환 모드 (free running mode)가 있는데 연속 변환 모드에서는 최대 분해능으로 초당 15,000번의 속도로 연속 변환을 수행토록 할 수 있다. A/D변환이 완료되면 변환 결과 값이 저장되는 SFR이 갱신되면서 A/D 변환 완료 인터럽트가 발생하도록 설정할 수도 있다.



Posted by 살레시오
,

 여기에서는 MATLAB에서 그래픽을 그려주는 함수들중 ezplot() 함수에 대해서 설명하겠다. MATLAB에서 자주 사용되는  그래픽 함수는 다음과 같다. (아래 함수들은 gnu octave 4.x 이상 버전에서 모두 지원한다.)


[표 1] 그래프 함수들

함수명

비고

ezplot(), fplot()

plot()

ezpolar(), polar()

loglog(), semilogx(), semilogy()

2차원 그래프

ezplot3(), ezmesh(), ezsurf()

plot3(), mesh(), surf()

3차원 그래프


 이것들 중 ezplot()함수는 사용자가 쉽게 (easy) 수학 함수의 그래프를 그릴 수 있도록 해주는 함수이고 fplot()함수는 함수(function)의 그래프를 그려주는 함수이다. 두 함수 모두 어떤 함수의 2차원 그래프를 그려주는 함수로서 명시적 함수( y=f(x) 의 형식) 과 암시적 함수 ( f(x,y)=0 의 형식)을 도시하는데 있어서 plot()함수보다는 보다 편하게 사용할 수 있다.

 가장 간단한 사용법은 도시하고자 하는 함수를 문자열로 입력하면 된다. 예를 들어 y=cos(x) 함수를 그리고 싶다면


>> ezplot('cos(x)')


[그림 1] gnu octave 4.x에서의 실행 결과


명시적 함수 y=f(x) 에서 f(x) 부분만 문자열로 입력하면 된다. y=sqrt(1-x2) 을 그리고 싶다면 다음과 같이 입력한다.


>> ezplot('sqrt(1-x^2)')

[그림 2] gnu octave 4.x 에서의 실행 결과


 만약 x축의 범위를 명시하고 싶다면 두 번째 파라메터로 x축의 최소값, 최대값을 가지는 행벡터를 입력하면 된다.


>> ezplot('sin(x)*cos(x)', [0 pi])

[그림 3] gnu octave 4.x 에서의 실행 결과


위의 명령은  sin(x)cos(x) 그래프를 그리되 x축의 범위를 0과 π사이로 하라는 것이다.


 암시적 함수도 그대로 문자열로 입력하면 된다. 예를 들어서 원의 방정식 x2+y2=16 을 그리고 싶다면 우변을 0으로 만든 다음 x2+y2-16=0 그 좌변을 입력하면 된다.


>> ezplot('x^2+y^2-16')


[그림 4] gnu octave 4.x 에서의 실행 결과


 이 경우도 두 번째 파라메터로 x축의 범위를 입력할 수 있다. 예를 들어 x3+y3-5xy+0.2=0 의 그래프를 그리되 x축의 범위를 [-3 3]로 하고 싶다면 다음과 같이 하면 된다.


>> ezplot('x^3 + y^3 - 5*x*y + 0.2',[-3,3])

[그림 5] gnu octave 4.x 에서의 실행 결과


 ezplot()함수는 x와 y의 관계식이 직접적으로 나타내지지 않고 매개변수에 의해서 관계 지어지는 경우도 도시할 수 있다. 예를 들어서 매개변수 t 에 대해서 x=sin(t) , y=cos(t)의 관계식이 주어진 경우 이들을 순서대로 입력하면 된다.


>> ezplot('sin(t)','cos(t)')

[그림 6] gnu octave 4.x 에서의 실행 결과


또한 다음과 같은 관계식을 가지는 x-y그래프를 t가 [0 π]의 범위를 가질 경우에 대해서 도시하려면

다음과 같이 하면 된다.


>> ezplot('sin(3*t)*cos(t)', 'sin(3*t)*sin(t)', [0,pi])

[그림 7] gnu octave 4.x 에서의 실행 결과


즉, 매개변수를 가지는 xy그래프를 그릴 때 세 번째 입력벡터는 매개변수의 범위가 된다.



Posted by 살레시오
,

 여기에서는 MATLAB에 내장된 수학 함수들을 소개한다.


  MATLAB의 모든 삼각함수는 입력과 출력의 단위로 라디안(radian)을 사용한다. 라디안을 도(degree)로 혹은 도를 라디안으로 변환하려면 다음과 같이 하면 된다.


>> angle_deg = angle_rad*(180/pi)
>> angle_rad = angle_deg*(pi/180)


[표 1] 삼각함수 관련 함수들

함수

기능

sin(x)

x의 sine값 계산

cos(x)

x의 cosine값 계산

tan(x)

x의 tangent값 계산

asin(x)

x의 arcsine값 계산. 단 x는 -1과 1사이의 값이어야 하고 결과값은 라디안으로 -π/2 와 π/2 사이의 값이다.

acos(x)

x의 arccosine값 계산. 단 x는 -1과 1사이의 값이어야 하고 결과값은 라디안으로 -π/2 와 π/2 사이의 값이다.

atan(x)

x의 arctangent값 계산. 결과값은 라디안으로 -π/2 와 π/2 사이의 값이다.

atan2(y,x)

y/x 의 arctangent값 계산. 결과값은 라디안으로 -π/2 와 π/2 사이의 값이다.


[표 2] 쌍곡선 함수들

함수

기능

sinh(x)

hyperbolic sin 함수

cosh(x)

hyperbolic cos 함수

tanh(x)

hyperbolic tan 함수

asinh(x)

각각의 역함수들

acosh(x)

atanh(x)


[표 3] 공통 함수

함수

기능

abs(x)

절대값(=|x|)

sqrt(x)

sqrtm(A)

제곱근( square root) 요소간 연산

제곱근. 행렬 연산

round(x)

반올림

fix(x)

x를 0의 방향의 가장 가까운 정수로

floor(x)

x를 -inf 의 방향의 가장 가까운 정수로

ceil(x)

x를 +inf 의 방향의 가장 가까운 정수로

sign(x)

x<0이면 -1, x=0이면 0, x>0이면 1을 반환

rem(x,y)

x를 y로 나눈 나머지

exp(x)

expm(A)

지수 함수, 요소간 연산

지수 함수, 행렬 연산

log(x)

logm(A)

밑이 e인 로그(자연 로그) 요소 간 연산

밑이 e인 로그(자연 로그) 행렬 연산

log10(x)

밑이 10인 로그

MATLAB에서 밑이 e인 로그함수는 log()이다. (ln()이 아님에 유의할 것) 밑이 10일 로그 함수는 log10 이다. 보통 수학책에서는 log 가 밑이 10인 로그 함수를 표기하는데 MATLAB에서는 밑이 e인 함수명이라는 것에 유의해야 한다.


[표 4] 복소수 관련 함수

함수

기능

abs(s)

복소수 s의 크기를 계산 (=|s|)

real(s)

복소수 s의 실수부 계산

imag(s)

복소수 s의 허수부 계산

conj(s)

켤레복소수

angle(s)

복소수의 각도(radian)를 계산


여기에서 소개한 함수들은 MATLAB의 기본적인 내장 함수이므로 별다른 조치 없이 바로 사용할 수 있다.



Posted by 살레시오
,

 여기서는 이전 포스트에 이어서 다항식 관련 함수들에 대해서 알아보겠다. 두 다항식의 곱셈은 conv()함수에 의해서 구해진다. 두 함수 a(x)=x3+2x2+3x+4 와 b(x)=x3+4x2+9x+16의 곱을 구해보자.


>> a=[1 2 3 4], b=[1 4 9 16]
a =
  1   2   3   4
b =
   1    4    9   16

>> c=conv(a,b)
c =
   1    6   20   50   75   84   64


이 결과로부터

c(x) = x6+6x5+20x4+50x3+75x2+84x+64

임을 알 수 있다.


 방정식간의 나눗셈은 deconv()함수를 이용한다. 앞에서 구한 방정식 c(x)와 b(x)를 이용하여 를 구하면 다음과 같다.


>> deconv(c,b) 󰎠
1.0000 2.0000 3.0000 4.0000


결과가 a(x)와 같음을 알 수 있다.


다항식의 미분을 계산하는 함수로 polyder()함수가 있다. 예를 들어 p(x)=x3-2x-5 의 미분함수를 계산하려고 한다면


>> p=[1 0 -2 -5]
p =
1 0 -2 -5
>> q=polyder(p)
q =
3.0000 0 -2.0000


여기서 p’(x)=3x2-2임을 알 수 있다. 만약 함수 polyder()로의 입력벡터가 두 개면 두 다항식의 곱의 미분을 구해준다.


>> a=[1 3 5], b=[2 4 6]
a =
1 3 5
b =
2 4 6

>> polyder(a,b)
8.0000 30.0000 56.0000 38.0000


여에서 a(x)=x2+3x+5와 b(x)=2x2+4x+6의 곱함수 a(x)b(x)을 미분한 결과는 8x3+30x2+56x+38 이라는 것을 알 수 있다. 마지막으로 입력도 두개이고 출력도 두개라면, 예를 들어서


>> [q,d]=polyder(a,b) 󰎠
q =
-2 -8 -2
d =
4 16 40 48 36


와 같이 사용한다면 a(x)/b(x)를 미분한 결과를 q(x)/d(x)로 반환해 준다. 즉 다음과 같은 다항식

을 미분한 결과는 다음과 같다는 것을 알 수 있다.


 이제 역라플라스 변환이나 역z변환에서 자주 쓰이는 부분분수전개 (partial fraction expansion) 에 대해서 살펴보자. 부분분수 전개를 수행하는 함수는 residue()함수이다. 어떤 다항식 a(x)와 b(x)에 대해서 a(x)가 다중근을 갖지 않는다면 분수식은 다음과 같이 전개될 수 있다.

예를 들어서

를 부분분수전개한 결과를 보려면 다음과 같이 하면 된다.


>> a=[1 6 8], b=[-4 8]
a =
1 6 8
b =
-4 8

>> [r1,p1,k1]=residue(b,a)
r1 =
-12
8
p1 =
-4
-2
k1 =
Empty matrix: 0-by-0


이것으로 부터 다음을 알 수 있다.

다음과 같이 다중근을 가지는 경우를 살펴보자.

이 식을 부분분수전개를 하려면 예를 들어 다음과 같이 하면 된다.


>> [r2, p2, k2] = residue( 1, poly([1 0.5 0.5]) )
r2 =
4.0000
-4.0000
-2.0000
p2 =
1.0000
0.5000
0.5000
k2 =
Empty matrix: 0-by-0


이 예에서 분모항 을 입력하기 위해서 poly()함수를 사용다. 반환된 벡터 r2,p2 그리고 k2로부터 다음과 같은 결과로 해독한다.

여기서 p2벡터의 세 번째 요소인 두 번째 0.5 는 이중근임을 나타냄에 유의해야 한다.


 지금까지 소개한 다항식에 관련된 함수들을 표로 정리하면 다음과 같다.


[표 1] 다항식에 관련된 함수들 정리

함수

기능

roots()

방정식의 해를 구한다

poly()

해로부터 방정식을 구한다

polyval()

특정한 스칼라값에서의 방정식의 값을 구한다

polyvalm()

특정한 행렬을 대입한 방정식의 값을 구한다

residue()

부분분수전개를 한다.

polyder()

방정식의 미분을 구한다.

conv()

방정식의 곱을 구한다.

deconv()

방정식의 나눗셈을 수행한다.



Posted by 살레시오
,

 MATLAB은 다항식을 다루는 몇 개의 함수를 제공한다. 예를 들어 방정식의 근을 구한다던가, 어떤 다항식의 미분 혹은 적분을 구하는 함수등이 제공된다.

 예를 들어서 x4-12x3+25x+116 이라는 다항식은 다음과 같이 계수들을 순서대로 가지는 p라는 변수에 저장한다.


>> p=[1 -12 0 25 116]
p =
    1   -12     0    25   116


여기서 계수들을 입력할 때 다항식이 사실 x4-12x3+0x2+25x+116 이므로  x2항의 계수인 0도 반드시 써야 한다는 것에 주의하자. 이제 이 방정식의 근은 roots()함수를 이용하여 구할 수 있다.


>> r=roots(p)
r =
11.747282870823
2.702820743841
-1.22505180733187 + 1.46720800872890i
-1.22505180733187 - 1.46720800872890i


위에서 보듯이 roots()함수는 해들은 열벡터에 저장하여 반환한다. 반대로 해로부터 방정식을 구할 수도 있다. 예를 들어 어떤 방정식의 해가 1,2,3,4,5 일 때 이들을 해로 가지는 방정식은 (x-1)(x-2)(x-3)(x-4)(x-5) 일 것이다. 이 방정식의 계수를 구하는 함수가 poly()함수이다.


>> poly([1 2 3 4 5])
ans =
    1   -15    85  -225   274  -120


위에서 1, 2, 3, 4, 5를 해로 가지는 방정식은 x5-15x4+85x3-225x2+274x-120 이라는 것을 알 수 있다. 처음 나왔던 예제에서 roots()함수를 이용하여 방정식의 근을 r에 저장하였다. 이것을 이용하여 원래의 방정식을 구할 수 있다.


>> pp=poly(r)
pp =
1.0000 -12.0000 -0.0000 25.0000 116.0000


입력변수가 nxn 크기의 행렬인 경우 poly()함수는 이 행렬의 특성방정식(characteristic equation)의 계수를 반환한다.


>> A=[1.2 3 -0.9; 5 1.75 6; 9 0 1] 󰎠
A =
1.2000 3.0000 -0.9000
5.0000 1.7500 6.0000
9.0000 0 1.0000
>> poly(A) 󰎠
1.0000 -3.9500 -1.8500 -163.2750


행렬의 특성방정식이란 det(xI-A) 를 말하며 위의 경우 이 특성방정식이 x3-3.95x2-1.85x-163.275 임을 알 수 있다. 이 특성방정식의 해가 바로 행렬의 고유치(eigenvalue)이다. 행렬의 고유치를 구하는 함수는 따로 마련되어 있으며 eig()함수이다.


>> roots(ans)
7.2826
-1.6663 + 4.4321i
-1.6663 - 4.4321i

>> eig(A)
7.2826
-1.6663 + 4.4321i
-1.6663 - 4.4321i


특정한 값에서의 함수값을 구하는 함수는 polyval()함수이다. 예를 들어 x=5에서 p에 저장된 다항식 값을 구하려면


>> polyval(p,5) 󰎠
-634


정방행렬에 대해서 다항식의 값을 구하는 것도 가능하다. 예를 들어서 q(x)=x3-2x-5 라는 함수가 있을때 행렬 A에 대해서 q(A)=A3-2A-5I 가 되는 것이다. 여기서 I는 항등행렬이다. 다항식에 대해서 행렬 계산을 구하는 함수가 polyvalm()함수이다.


>> A=[2 4 5;-1 0 3; 7 1 5]
A =
2 4 5
-1 0 3
7 1 5

>> q=[1 0 -2 -5]
q =
1 0 -2 -5

>> polyvalm(q,A)
377 179 439
111 81 136
490 253 639


위의 결과에 대해서 검산을 하면 다음과 같다.


>> A^3-2*A-5*eye(3) 󰎠
377 179 439
111 81 136
490 253 639


여기서 eye(3)은 3x3 항등행렬을 생성해주는 함수이다.



Posted by 살레시오
,

 MATLAB에서 제공하는 논리 연산자는 다음 표와 같다.


[표 1] 논리 연산자

논리연산자

기능

&

AND

|

OR

~

NOT


(부연하자면 C/C++의 비트연산자와 같다. MATLAB은 비트 연산자는 없다.)

 다음 예를 보자


>> A=magic(3)
A =
8 1 6
3 5 7
4 9 2

>> B=pascal(3)
B =
1 1 1
1 2 3
1 3 6

>> ~(A>B)
0 1 0
0 0 0
0 0 1

>> (A>2)&(B<3)
1 0 1
1 1 0
1 0 0


 이전 포스트에서 설명한 기본 논리/관계연산자 외에도 MATLAB은 추가적인 다양한 논리/관계 함수를 제공한다.


[표 2] 관계/논리 연산 관련 함수들 (X, Y는 함수)

함수명

함수의 기능

Z=xor(X,Y)

XOR 연산을 수행한다

Z=any(X)

벡터 X의 요소 중 하나라도 0이 아닌 요소가 있으면 1을 반환, X가 행렬일때는 열단위로 연산된다.

z=all(X)

벡터 X의 요소들 모두 0이 아니면 1을 반환

(X가 행렬일 때는 열단위로 연산된다.)

z=isempty(X)

행렬 X가 빈행렬이면 1을 반환

z=isequal(X,Y)

행렬 X와 Y가 완전히 동일하면 1을 반환

Z=isinf(X)

행렬 X의 요소 중 inf가 있는 곳에 1을 반환

Z=isnan(X)

행렬 X의 요소 중 nan이 있는 곳에 1을 반환

z=isreal(X)

행렬 X의 요소 중 복소수가 하나도 없으면 1을 반환


위의 도표에서 소문자 z가 출력변수이면 그 함수는 스칼라값(0혹은1)을 반환함을 의미하며 대문자 Z가 출력행렬이면 그 함수는 입력 파라메터와 동일한 크기를 갖는 행렬을 반환한다는 것을 의미한다.


 이 중 isequal()함수는 연산자 (==)와 같은 역할을 하는 것 아닌가 생각할수 있으나 (==)연산자는 요소간 비교이고 isequal()함수는 두 행렬 전체를 비교하는 함수이다. 다음 예에서 이를 확인해 보라.


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

>> B=[1 2;3 4]
B =
1 2
3 4

>> C=[1 2; 3 5]
C =
1 2
3 5

>> A==B
1 1
1 1

>> A==C
1 1
1 0

>> isequal(A,B)
1

>> isequal(A,C)
0




Posted by 살레시오
,

 관계 연산이나 논리연 산에서는 C언어에서와 유사하게 MATLAB은 0을 거짓으로 0이 아닌 다른 수(보통은 1이 쓰임)를 참으로 간주한다. 모든 관계 연산과 논리 연산에서 참이면 1, 거짓이면 0을 그 결과로서 반환한다. MATLAB에서의 관계 연산자는 다음 표와 같다.


[표 1] 관계 연산자

관계 연산자

의미

<

작다.

<=

작거나 같다.

>

크다.

>=

크거나 같다.

==

같다.

~=

다르다.


위의 표에서 ‘같다’와 ‘다르다’에 주의해야 한다. C언어를 처음 배울 때도 대입연산자(=)와 관계연산자(==)를 혼동해서 논리적 오류를 범하는 경우가 많은데 여기에서도 그렇다. 두 연산자를 잘 구분해야 한다. 그리고 ‘다르다’는 (!=)가 아니고 (~=)임에 유의하자.


 관계연산자의 피연산자는 두 개인데 다음의 두 가지 경우가 있을 수 있다.

① 둘 다 행렬일 경우 - 이 경우는 두 행렬의 차수가 같아야 하고 각 행렬의 요소간의 관계가 검색된다. 결과로는 같은 차수의 행렬이 생성된다.

② 하나는 행렬 다른 하나는 스칼라인 경우 - 스칼라와 행렬의 각 요소간의 관계가 검색되며 결과로는 행렬과 같은 차수의 행렬이 생성된다.

 다음의 예를 보자.


>> A=1:4, B=4-A
A =
1 2 3 4
B =
3 2 1 0

>> C = A>2
C =
0 0 1 1

>> D = (A==B)
D =
0 1 0 0

>> E = A<=B
E =
1 1 0 0


첫 번째 예에서는 행렬 A와 스칼라 2를 비교했다(A>2). 따라서 행렬 A의 각 요소와 2를 비교해서 그 요소가 크면 1을 그렇지 않으면 0을 가지는 행렬을 만들어서 C에 대입하는 것이다. (A==B)에서는 둘 다 행렬이고 이 경우에 두 행렬의 크기는 같아야 한다. 같은 위치에 있는 요소를 비교하여 같으면 1 다르면 0을 갖는 행렬을 반환하게 된다.


 다음과 같이 관계연산자와 산술연산자를 혼용할 수도 있다.


>> B-(A>2) 󰎠
3 2 0 -1


위의 예에서 (A>2)의 결과는 0과 1로 이루어진 보통의 행렬이기 때문에 산술연산(이 경우 뺄셈)에 사용될 수 있음을 보여주는 것이다. 다음 예제를 보자.


>> x1=-1:1
x =
-1 0 1

>> x2=x1+(x1==0)*eps
x2 =
-1.0000 0.0000 1.0000


위의 예제에서 벡터 x1을 [-1 0 1]로 생성시키고 두 번째 명령에서 x1에서 0인 요소를 찾아서 0대신 eps를 대입한 후 x2에 대입한 것이다. eps는 MATLAB에서 표현할 수 있는 가장 작은 수이다. 이제 다음을 보자.


>> sin(x1)./x1
0.8415 NAN 0.8415


위에서 두 번째 요소가 NAN인데 이것은 x1의 두 번째 요소가 0이고 sin(0)도 0이기 때문에 0/0 인 결과가 되어서 그렇다. 올바른 극한값 1을 얻기 위해서는 x1의 0을 eps로 치환한 x2를 이용하면 된다.


>> sin(x2)./x2 󰎠
0.8415 1.0000 0.8415



Posted by 살레시오
,

 여기에서는 행렬-스칼라 그리고 행렬-행렬간의 산술 연산에 대해서 설명을 하겠다. 다음의 예를 보자.


>> G=[1 2 3 4;5 6 7 8]
G =
1 2 3 4
5 6 7 8

>> G-2
-1 0 1 2 3 4 5 6

>> -2+G
-1 0 1 2 3 4 5 6


이 예에서 변수 G는 행렬이고 2는 스칼라이다. 기본적으로 (수학적인) 행렬의 덧셈 뺄셈은 두 행렬의 차수가 같아야 하지만 한쪽이 스칼라이고 다른 한쪽이 행렬이면 행렬의 모든 요소에서 그 스칼라를 더하거나 빼준 행렬을 결과로 내보낸다.


>> 2*G-1 󰎠
1 3 5 7
9 11 13 15


스칼라와 벡터/행렬의 곱은 수학적인 의미 그대로이며 연산 우선순위도 스칼라연산과 같다. 위의 경우 곱을 먼저 행하고 뺄셈을 행하게 된다.


 행렬 간의 덧셈, 뺄셈은 두 연산자의 차수가 같아야 한다. 다음과 같이 행렬 G와 H를 입력해보자.


>> G=[1 2 3 4; 5 6 7 8; 9 10 11 12] 󰎠
G =
1 2 3 4
5 6 7 8
9 10 11 12

>> H=[1 1 1 1;2 2 2 2; 3 3 3 3] 󰎠
H =
1 1 1 1
2 2 2 2
3 3 3 3


그리고 다음과 같이 덧셈, 뺄셈을 수행해 보라.


>> G+H
2 3 4 5
7 8 9 10
12 13 14 15

>> ans-H
1 2 3 4
5 6 7 8
9 10 11 12

>> 2*G-H
1 3 5 7
8 10 12 14
15 17 19 21


 곱셈의 경우 곱셈기호(*)앞의 행렬의 열수와 뒤 행렬의 행수가 같아야 계산이 수행된다. 따라서 위의 두 행렬 G와 H는 곱셈을 할 수 없다. Ht라는 행렬을 다음과 같이 정의하면


>> Ht=h'
Ht =
1 2 3
1 2 3
1 2 3
1 2 3


이제 행렬 G(차원)와 Ht(차원)간의 곱셈은 가능해진다.


>> G*Ht
10 20 30
26 52 78
42 84 126


 다른 연습 예제로서 다음과 같은 행렬 A와 B가 있을 때,

두 행렬의 곱 AB, BA, ATBT, BTAT 를 각각 구해보라.

 MATLAB에서 행렬간의 곱셈은 이와 같은 보통 행렬 간 곱셈뿐만 아니라 행렬 요소 간의 곱셈도 가능하다. 행렬 요소 간 곱셈을 행하는 연산자는 (.*)이고 이 연산자 앞뒤에 오는 피연산자들의 차원은 같아야 한다.


>> G.*H
1 2 3 4
10 12 14 16
27 30 33 36


행렬 간의 나눗셈은 무슨 의미 일까? 예를 들어서


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

>> B=[5 6;7 8]
B =
5 6
7 8



와 같이 정의된 정방행렬 A와 B에 대해서 A/B 또는 B\A는 무슨 의미일까? 결과를 확인해 보자.


>> A/B
3.0000 -2.0000
2.0000 -1.0000
>> B\A
5.0000 4.0000
-4.0000 -3.0000


스칼라의 경우를 생각해 보자. 4/3은 4에게 3의 역수를 곱하는 계산 즉, 4x3-1이다. 마찬가지로 3\4은 3의 역수를 4에 곱하는 것(3-1x4)이다. 행렬의 경우도 마찬가지이다. A/B는 행렬 A에 B의 역행렬을 곱하는 것이고, B\A는 B의 역행렬에 A행렬을 곱하는 것이다. 두 결과가 같다고 생각하기 쉽지만  '행렬에서는 교환법칙이 성립하지 않는다'는 것에 유의해야 한다. 위의 결과를 보아도 서로 다르다는 것을 알 수 있다. 즉 A/B와 B\A는 A와 B가 스칼라라면 같은 수이지만 행렬이라면 서로 다른 행렬이 된다.


 MATLAB에서 역행렬을 구하는 함수는 inv()이다. (inverse 의 줄임말을 함수명으로 채용)


>> A*inv(B)
3.0000 -2.0000
2.0000 -1.0000

>> inv(B)*A
5.0000 4.0000
-4.0000 -3.0000


위의 결과와 이전의 그것과 같다는 것을 알 수 있다. 여기서는 정방행렬의 경우만 다루고 있는데 정방행렬이 아닌 행렬의 가역행렬(pseudo-inverse matrix)를 구하는 함수로 pinv()가 있다. 이에 대해서는 다음에 다루도록 한다.


 나눗셈의 경우도 행렬 요소간 나눗셈이 가능하다. 연산자(./)와 (.\)가 바로 그러한 역할을 한다.


>> A./B 󰎠
0.2000 0.3333
0.4286 0.5000

>> B.\A 󰎠
0.2000 0.3333
0.4286 0.5000


요소 간 연산인 경우에는 항상 두피연산자의 차수가 같아야 한다. 위의 결과를 보면 A./B와 B.\A의 계산결과는 같다는 것을 알 수 있다.(왜일까?)


 행렬의 거듭제곱을 구하는 데는 (^)연산자가 사용되며 행렬의 요소 각각의 거듭제곱을 구하는 데는 (.^)연산자가 사용된다.


>> A^2
7 10
15 22

>> A.^2
1 4
9 16

>> A.^-1
1.0000 0.5000
0.3333 0.2500

>> 2.^A
2 4
8 16

>> A.^B
1 64
2187 65536


이 예에서 A^2과 A.^2 그리고 2.^A의 차이를 확실히 구별해야 한다. 곱셈(*)과 나눗셈(/혹은\) 그리고 거듭제곱(^)을 수행하는 연산자 앞에 ‘점(.)이 붙으면 요소간 연산’이라는 사실을 기억해야 한다.



Posted by 살레시오
,

 파이썬 3.4 이상에서 표준화된 Enum객체를 지원한다. 자세한 설명은 여기에 있다. 간략한 사용법을 알아보도록 하자.


 일단 Enum 클래스를 임포트해야 한다.


>>> from enum import Enum


첫 번째로 다음과 같이 클래스를 Enum을 상속해서 생성할 수 있다.


>>> class Color(Enum):
...     red = 1
...     green = 2
...     blue = 3


이제 Color.red 또는 Color.green 과 같이 사용할 수 있다. 첫 번째 값은 보통 1부터 시작한다. (0으로 시작하면 그 필드는 False가 된다.)


 다른 방법으로 다음과 같이 더 간단히 생성할 수 있다.


>>> Color = Enum('Color', 'red green blue')


유의할 점은 인스턴스 이름과  Enum생성자의 첫 인자가 (위에서 밑줄 쳐진 두 부분) 같아야 한다. 이제 이전과 마찬가지로 Color.red 또는 Color.green 과 같이 사용할 수 있다.


enum 필드는 name과 value를 가진다. 예를 들어 Color.blue 의 name 은 'blue' value 는 3 이다.


>>> Color.blue.name
'blue'

>>> Color.blue.value
3

>>> type(Color.blue)
<enum 'Color'>



Posted by 살레시오
,

 MATLAB은 극소값이나 무한대 값, π 등을 표현하는 상수들이 있으며, 이러한 특수한 값을 표현하는 변수들을 예약어(keyword)dl므로 사용자 변수로 이용하지 않아야 한다.


[표 1] MATLAB 상수들

상수

의미

i 혹은 j

허수

e

자연 상수 (exponential constant)

pi

원주율 π

inf / Inf

무한대 (0이 아닌 수를 0으로 나눌 때 발생)

nan / NaN

Not a Number (0을 0으로 나눌 때 발생)

realmax

realmin

표현할수 있는 가장 작은 실수 값

표현할수 있는 가장 큰 실수 값

eps

이 eps에 설정되어 있는 수 보다 작은 수를 0으로 간주함 (기본값은 2.2204x10-16)

ans

이전에 계산한 결과값들 중 변수에 저장되지 않은 값

computer

현재 구동 시스템의 종류를 출력

version

MATLAB의 버전을 출력


 원주율이나 자연상수 값을 확인하고 싶으면 명령어창에서 입력하면 알 수 있다.


>> format long

>> e
ans =  2.71828182845905

>> pi
ans =  3.14159265358979

>> realmin
ans =   2.22507385850720e-308

>> realmax
ans =   1.79769313486232e+308


 내부 변수 ans는 이전 단계에 계산한 결과값들 중 변수에 저장되지 않은 값을 가지고 있다.


>> [1 2; 3i 4+5j] % 변수에 저장하지 않았다.
1.0000 2.0000
0 + 3.0000i 4.0000 + 5.0000i
>> ans 󰎠
1.0000 2.0000
0 + 3.0000i 4.0000 + 5.0000i


명령어 computer는  현재 컴퓨터의 종류를 반환한다.


>> computer 󰎠
PCWIN


그리고 ver  현재 MATLAB의 버전을 반환한다.


>> ver
5.0.020613




Posted by 살레시오
,