MATLAB 에서 여러 개의 텍스트 파일이나 data 파일 등을 dir 명령어를 이용하여 파일 목록을 가져올 있습니다.

 

파일 목록을 가져 후에 for 등을 이용하여 일괄적으로 파일을 열어서 데이터를 가져 오는 것이 가능 합니다.

 

하지만 MATLAB dir 명령은 recursive 하게 동작하는 옵션은 없습니다.

 

이러한 경우에는 MATLAB 에서 운영체제의 명령어를 이용하여 처리하는 것이 좋습니다.

 

윈도우 운영체제에서 도스 명령어를 이용할 경우에는 dos command 같은 형태로 이용합니다.

 

또는 [status, result] = dos('command') 같이 이용하여 dos 명령 실행 결과를 MATLAB 으로 가져 수도 있습니다.

 

이제 현재 폴더에서 모든 txt 파일을 recursive 하게 찾아 보죠~

  

[~, result] = dos('dir /s /b *.txt'); % dos 명령 실행 recursive 하게 최소 형식으로 txt 파일 찾기 실행


filenames = textscan(result,'%s','delimiter',char(10)); %
바꿈(\n) 구분자로 해서 결과를 나눔


filenames2 = filenames{1}; % cell type
으로 파일이름 저장


 

 

코드에서 filenames2 변수에 원하는 txt 파일들의 전체경로가 저장이 됩니다.

 

그럼 for 등을 이용해서 열기만 하면 되는 거죠~


'programming language > MATLAB' 카테고리의 다른 글

MATLAB GUI 창 크기 조절  (4) 2012.03.03
MATLAB GUI  (4) 2012.02.24
MATLAB figure ButtonDownFcn  (0) 2012.02.22
Simulink Algebraic Loop  (0) 2012.02.13
MATLAB dos 명령 사용하기  (0) 2011.12.21
MATLAB convolution  (0) 2011.11.20
Window command 에서 MATLAB 실행 방법  (0) 2011.11.20
MATLAB, end 를 이용한 데이터 추가  (1) 2011.11.18
MATLAB 집합 관련 함수들  (0) 2011.06.13

요즘 부쩍 MATLAB for 문을 이용한 convolution 에 대한 질문이 많이 들어오는군요.

 

그래서 오늘은 MATLAB for loop 를 이용한 convolution 에 대해 설명 드리려 합니다.

 

다들 아시는 바와 같이 MATLAB 에는 기본적으로 convolution 을 수행하는 함수인 conv() 라는 함수가 존재 합니다.

 

c=conv(a, b) 와 같은 형태로 쓰이곤 합니다.

 

당연히 a 와 b 의 convolution결과를 c 에 리턴 하는 함수이죠

 

convolution 이라는 것이 결국에는 FIR filter 와 같다고 보셔도 무방 합니다.

 

다만 그 return 되는 값의 길이에 있어서 차이가 있죠.

 

이는 filter 의 shift register 를 다시 0으로 채워주는 과정이 추가가 되기 때문 입니다.

 

convolution 을 for loop 를 이용해서 구현해 보면 다음과 같습니다. 

 

위 에서 a, b 는 둘 다 length가 3 이므로convolution 결과는 3+3-1=5 길이가 되게 됩니다.

 

단순히 buffer 를 시프트 하고 곱하고 더하고 하는 과정이니 코드를 보시면 쉽게 아실 수 있을 겁니다.

 

결과는 다음과 같습니다.

 

 

conv() 함수를 이용하였을 경우와 for loop 를 이용하였을 경우의 결과가 같음을 확인 할 수 있습니다.


'programming language > MATLAB' 카테고리의 다른 글

MATLAB GUI  (4) 2012.02.24
MATLAB figure ButtonDownFcn  (0) 2012.02.22
Simulink Algebraic Loop  (0) 2012.02.13
MATLAB dos 명령 사용하기  (0) 2011.12.21
MATLAB convolution  (0) 2011.11.20
Window command 에서 MATLAB 실행 방법  (0) 2011.11.20
MATLAB, end 를 이용한 데이터 추가  (1) 2011.11.18
MATLAB 집합 관련 함수들  (0) 2011.06.13
MATLAB plot tools  (0) 2011.05.26

오늘은 window command 라인 상에서의 MATLAB 실행 방법에 대해 소개하려 합니다.

 

보통의 MATLAB 의 실행은 아이콘을 더블 클릭해서 실행하곤 하는데 ~ 이 경우에는 MATLAB desktop 이 실행되다 보니 로딩이 좀 늦고 무거운 감이 있습니다.

 

물론 컴퓨터 성능에 따라 정도의 차이는 있지만요~

 

간단하게 계산기 용도로 쓸 때나 미리 작성한 script 등을 실행시키고 이의 결과를 얻으려고 할 때 등은 굳이 무거운 MATLAB desktop 을 실행 시킬 필요는 없습니다.

 

마치 window batch 파일을 실행 시키는 것처럼 MATLAB을 실행시키는 방법에 대해 알아보죠~

 


 

아래의 링크 페이지를 참조 하면 window command 라인에서의 MATLAB 실행 명령어 들에 대해 알 수 있습니다.

 

참조: MATLAB help

 

이중에서 저는 주로 –automation 옵션과 –r, -logfile 옵션 등을 주로 이용 합니다.

 

  • –automation 옵션은 MATLAB을 automation server 로 시작하도록 하며 최소화 된 상태로 시작하도록 합니다.

 

  • -r "statement" 옵션은 시작하자마자 MATLAB "statement" 를 실행하는 것입니다.

 

  • -logfile "filename" 옵션은 command 창의 결과들을 "filename" 이라는 파일에 기록하는 것입니다.

 

  • -wait 옵션은 MATLAB 실행이 끝날 때까지 window command 명령 입력을 못하도록 대기 시키는 것입니다.

 



 

window command 창에서 다음과 같이 명령을 하면

 

 

다음과 같은 command window 하나가 최소화된 형태로 딸랑 나옵니다.

 

 



 

다음으로 –r 옵션을 실험해 보죠. 다음과 같이 a=1, b=2, c= a+b 명령을 실행하게 해 보죠.

 

 

이렇게 해서 실행된 MATLAB command 는 위에 그냥 -automation 한 것과 차이가 없죠?

 

이건 명령에 세미콜론(;)을 붙여 줬기 때문에 command 창에 결과가 나타나지 않은 것뿐입니다.

 

아래와 같이 whos 명령을 통해 workspace 에 어떤 변수들이 있는지 확인 할 수 있습니다.

 

 



 

이제 마지막으로 –logfile 옵션을 알아보죠.

 

다음 그림의 command 창 명령어는 a=1, b=2, c=a+b를 계산하고 이 결과를 D:\result.txt 에 기록하는 예입니다.

 

 

command window 에는 다음과 같이 나오게 되고~

 

 

result.txt 파일에는 command window 창의 결과가 아래와 같이 저장되게 되는 것을 확인 할 수 있습니다.

 

 




 

이제 특정 스크립트들을 batch 파일의 형태로 실행 시켜 보도록 하죠~

 

다음과 같이 두 개의 script 를 실행시키는 matlab_batch.bat 이라는 batch 파일을 만들어 보죠.


% D:\script1.m

a=2
b=1:10
c=a*b

 
% D:\script2.m

a=2
b=1:10
c=a*b

 

% matlab_batch.bat

matlab -automation -r run('D:\script1.m'),quit -logfile D:\result1.txt -wait
matlab -automation -r run('D:\script2.m'),quit -logfile D:\result2.txt -wait


 

위 batch 파일을 실행 시키면 다음과 같이  result1.txt, result2.txt 라는 결과를 얻을 수가 있습니다.

 

 

 

주기적으로 실행 시켜야 되는 MATLAB script가 있다면 batch 파일을 만들어서 예약작업의 형태로 실행시킨다면 좀더 편리하게 작업할 수 있을 거라고 생각되네요~


'programming language > MATLAB' 카테고리의 다른 글

MATLAB figure ButtonDownFcn  (0) 2012.02.22
Simulink Algebraic Loop  (0) 2012.02.13
MATLAB dos 명령 사용하기  (0) 2011.12.21
MATLAB convolution  (0) 2011.11.20
Window command 에서 MATLAB 실행 방법  (0) 2011.11.20
MATLAB, end 를 이용한 데이터 추가  (1) 2011.11.18
MATLAB 집합 관련 함수들  (0) 2011.06.13
MATLAB plot tools  (0) 2011.05.26
MATLAB Graphic handle  (0) 2011.05.25

MATLAB 의 end 키워드는 보통 벡터 또는 매트릭스 등의 마지막 인덱스를 의미하는데 이용 되곤 합니다.

 

다음 예는 일반적인 사용에 대한 예입니다.

 

 

end 키워드를 이용하여 x 의 마지막 인덱스를 참조 하곤 하죠.

 

이렇게 참조 하는 것 이외에도 end 를 이용하여 벡터 또는 매트릭스에 데이터를 추가 할 수도 있습니다.

 

위의 x 라는 벡터의 끝에 11~20을 추가 해 보겠습니다.

 

일반적으로 다음과 같이 벡터를 붙여서 추가를 하곤 합니다.

 

 





또 다른 방식으로는 end 를 이용하여 다음과 같이도 추가 할 수 있습니다.

 

 

x 라는 벡터의 끝에서부터 +1 번째 인덱스부터 +10 번째 인덱스에 11~20을 넣으라는 뜻으로 해석할 수 있습니다.


'programming language > MATLAB' 카테고리의 다른 글

Simulink Algebraic Loop  (0) 2012.02.13
MATLAB dos 명령 사용하기  (0) 2011.12.21
MATLAB convolution  (0) 2011.11.20
Window command 에서 MATLAB 실행 방법  (0) 2011.11.20
MATLAB, end 를 이용한 데이터 추가  (1) 2011.11.18
MATLAB 집합 관련 함수들  (0) 2011.06.13
MATLAB plot tools  (0) 2011.05.26
MATLAB Graphic handle  (0) 2011.05.25
MATLAB adaptive filtering, Least Mean Square(LMS)  (3) 2011.05.23
  1. 2015.12.15 14:56

    비밀댓글입니다

오늘은 MATLAB의 집합 관련 함수들에 대해 알아보겠습니다.

 

다음과 같은 벡터 A,B 에 대하여 교집합은 intersect()라는 함수를 이용합니다. 

 

합집합은 union() 함수를 이용합니다. 

 

차집합은 setdiff() 함수를 이용합니다. 

 

위 결과에서 A-B 를 하므로 교집합 [1 2] 를 제외하고 [3 4 5 6] 이 출력되게 됩니다.

 

벡터 내의 유일한 원소에 대해 찾고 싶을 때는 unique() 함수를 이용합니다. 

 

위 예에서 1, 2, 3 은 중복이 되 있으므로, 한번씩만 나타내게 되는 겁니다.


'programming language > MATLAB' 카테고리의 다른 글

MATLAB dos 명령 사용하기  (0) 2011.12.21
MATLAB convolution  (0) 2011.11.20
Window command 에서 MATLAB 실행 방법  (0) 2011.11.20
MATLAB, end 를 이용한 데이터 추가  (1) 2011.11.18
MATLAB 집합 관련 함수들  (0) 2011.06.13
MATLAB plot tools  (0) 2011.05.26
MATLAB Graphic handle  (0) 2011.05.25
MATLAB adaptive filtering, Least Mean Square(LMS)  (3) 2011.05.23
MATLAB Dependency Report  (0) 2011.05.21

아래 포스팅에서 MATLAB의 graphic handle 에 대해 간단하게 설명 드렸는데요.

   

2011/05/25 - [MATLAB] - MATLAB Graphic handle

 

오늘은 GUI 로 각 property 들을 바꾸는 방법그래프 설정을 함수화 해서 재 사용하는 방법에 대해 알아보겠습니다.

 

일단 다음과 같은 코드로 그래프를 하나 띄우죠.

 

x=1:10;

y=1:10;

plot(x,y);

 

위 코드를 실행해서 나온 아래 그림과 같은 그래프에서 빨간색 네모 칸 부분을 클릭 합니다. 

 

 

그럼 창이 최대화 되면서 그림 창이 아래 그림과 같이 바뀌게 됩니다. 

  회색인 바탕 화면을 하얀색으로 만들고 싶으면 Figure Color 부분을 선택해서 원하는 색상으로 변경 하시면 됩니다.

 

그럼 다음과 같이 변하게 되죠. 

  

title 을 설정하고 싶으면 아래 그림처럼 축 부분을 선택 한 다음에 title 부분에 글을 넣어 주면 됩니다. 

 

다른 property 들도 변화 시키고자 하는 객체를 선택 후에 GUI 를 통해 쉽게 변경 시킬 수 있습니다.

 

다 설정 했으면 위 그림의 동그라미 친 부분을 클릭 합니다.


 

이제 위에서 설정한 property 부분들을 다음에도 똑같이 설정하도록 코드로 만들어서 저장해보죠.

 

File 메뉴Generate Code 메뉴를 클릭하면 위 그래프를 그리기 위한 코드가 다음과 같이 생성 됩니다.

 

 

적절한 위치에 위 함수를 저장 후에 언제든 똑 같은 설정으로 그래프를 그릴 수 있습니다.


MATLAB 그래프를 좀 더 효율적으로 또는 다양하게 변화 시키고 싶다면, graphic handle 에 대해 아셔야 합니다.

 

일단 다음과 같은 y = x 그래프를 하나 그려보죠.


 



x=1:10; y=1:10;

h_graphic=plot(x,y);

 

다음과 같은 그래프가 나오죠.

 

 

 

 

위 코드의 h_graphic 이 바로 이 그래프 선의 handle 입니다.

 

h_graphic 에는 그래프에 대한 다양한 property 들이 들어 있고 현재의 설정 상태를 확인 할 때는 get(h_graphic) 명령어를 통해 확인 할 수 있습니다.

 

command 창에 다음과 같이 설정 상태가 나옵니다.

 

 


 
 

그럼 간단하게 set() 명령어를 이용하여 YData 를 다음 코드처럼 변경해 보죠.

 

set(h_graphic, 'Ydata',[1:10]*2)

 

set() 명령어를 이용하여 handle 의 property를 변경 할 때는 set(handle, 'property name', 변경할 값)의 형태로 넣어 주면 됩니다.

 

property name 은 구분만 되면 일부만 써도 상관이 없습니다.

 

즉 위의 코드는 다음과 같이 써도 무방합니다.

 

set(h_graphic, 'yd',[1:10]*2)

 

위 코드에 의해 y=2*x 형태의 그래프가 된 것을 확인 할 수 있습니다.

 

 




 

MATLAB 의 핸들 값들은 double class 의 값들로 되 있습니다.

 

h_graphic 을 command 창에 타이핑 해보면 다음과 같은 결과가 나옵니다.

 

 

현재 figure 창의 handle 은 gcf 라는 키워드를 통해 알 수 있습니다.

 

 

현채 axis 의 handle 은 gca 라는 키워드를 통해 알 수 있습니다.

 

 

 

다음 코드를 통해 h_graphic의 parent, 즉 상위 handle 이 무엇인지를 확인 할 수 있습니다.

 

 
 

위에서 확인한 현재의 axis handle 이 h_graphic의 parent handle 이라는 것을 확인 할 수 있죠.



 

그래프의 각 object 를 직접 선택하여 handle 값을 구할 수도 있습니다.

 

즉 내가 바꾸고자 하는 부분이 어떤 핸들인지 용어를 알지 못해도 직접 그래프에서 선택해서 handle 을 알 수 있다는 것입니다.

 

다음 그림처럼 커서 버튼(Edit Plot)을 클릭 후에 흰색 바탕 부분을 선택합니다.

 

 

 

 

그리고 command 창에 gco 를 타이핑 하면 현재 선택한 object 의 handle 을 알려 줍니다.

 

 

위 command 결과를 보면 위 그림에서 선택한 부분이 바로 axis handle 부분이라는 것을 알 수 있습니다.


오늘은 적응형 알고리즘 중에서 가장 간단하면서도 많이 사용되는 Least Mean Square(LMS) 알고리즘에 대해 설명 드리겠습니다.

 

적응형 알고리즘은 임의의 모르는 시스템에 대한 identification이나 inverse response 를 구해서 채널 추정을 한다거나 할 때 주로 이용되며, 그 적용의 예는 무궁무진 하다고 합니다.

 

그 중에서도 LMS 알고리즘은 1960 년대에 만들어진 알고리즘임에도 불구하고 구현이 간단하고, 성능 또한 복잡도 대비 우수하여 많이 이용되고 있습니다.

 



 

계수 조절이 가능한 탭수 N 의 FIR 필터가 있는 경우 이 필터의 출력 신호 y(n)은 다음과 같이 정의 됩니다.

 

 

FIR 필터와 비교할 원하는 신호를 d(n) 이라 할 때 그 오차를 다음과 같이 계산할 수 있죠.

 

 

위 에러 신호의 제곱의 합을 최소화 하는 방향으로 필터의 계수를 적응 시켜야 하며, 오차의 제곱은 다음과 같은 식으로 전개가 됩니다.

 

 

 

위 에러의 제곱 식을 최소화 하려면 에러 제곱 식을 필터의 계수로 미분 하고 그 값이 0 인 계수 값을 구하면 될 것입니다.

 

 

위 식은 만족 하는 h(k) 에 대한 식은 다음과 같이 정리가 됩니다.

 

 

LMS 알고리즘의 위 식을 명시적으로 계산하는 것이 아닌 재귀적 경사법(Gradient Method)을 사용하여 최적의 필터 계수를 찾아줍니다.

 



 

LMS 알고리즘의 적용 과정은 다음과 같습니다.

 

  • h(k)의 임의의 초기값인 h0(k) 값을 설정합니다.

 

  • 입력 신호 x(n)을 적응 FIR 필터에 인가하여 그에 해당하는 출력 y(n)을 계산한 후에 오차 신호 e(n)을 계산합니다.

 

 

  • 아래 식을 이용하여 필터의 계수들을 update 합니다.

 

 

  • 위 식에서 μ 는 step size이며 최적의 해로 수렴하는 속도를 결정, 알고리즘의 안정성을 확보하기 위하여 다음 범위 안에 있어야 합니다.

 

,    

  


 

이제 위에서 설명한 LMS 알고리즘을 이용하여 아래 그림과 같은 Unknown FIR system 에 대한 identification 을 수행해 보죠.

 

 

  • Signal generator : [-a, a]에서 균일하게 분포하는 불규칙 신호, Px=a2/3 , a = 2

 

  • Unknown FIR system : [-0.87    0.5 0.3 -0.1 0.03]

 

  • Adaptive FIR Filter length, N=7로 설정

 

  • 안정성을 확보 하기 위한 μ 의 범위는 아래와 같음

 

 

위 문제에 대한 시뮬레이션 코드는 다음과 같습니다.

 

 

위 시뮬레이션에 따른 결과는 다음과 같습니다.

 

 

unknown system 에 대해 LMS filtering 을 수행하여 정상적인 identification 을 수행하는 것을 확인 할 수 있습니다.



<2013-01-24 추가 내용>

Demi 님이 방명록에 질문하신 내용에 대한 답변 입니다. 


desired 신호가 sine 이 되게 하고 x 입력 신호가 sine + noise 가 되게 한겁니다.


코드는 다음과 같구요~ 


위 코드 작성후에 돌려 보시면 아래와 같은 결과가 나옵니다. 

설명을 위해 파라미터 등을 대충 잡아 준거라 그림이 좀 조잡해 보이긴 하지만~ 예제를 보면 어떻게 되는건지 이해 하실거라 생각합니다. 



  1. 남성 2013.01.29 01:30 신고

    ih77 님의 방명록 질문에 대한 답변 입니다.
    d 가 x 와 같은 값을 가지는건 아닙니다. 위 포스팅에서도 d 와 x 는 다르죠.
    위 글에서의 LMS 는 x 라는 입력에 대해 필터링 과정을 통해 d 와 같은 신호로 만들기 위한 과정이고, 결과적으로 정상적으로 LMS 가 동작해서 e(error) 가 0 으로 수렴된다면, y 가 d 와 같아지는 겁니다.

  2. 여성 2013.04.01 22:47

    안녕하세요?
    좋은 정보 많이 얻고 갑니다.
    헌데 궁금한 점이 하나 있어서 긍를 남김니다.
    맨 마지막 sin파형과 노이즈 파형을 합쳐서 lms 알고리즘을 이용하여 sin 파형을 걸러내는 걸 보았는데
    왜 error값이 출력값이 되는 건가요?
    이 목적이 하나의 신호를 desired 신호로 가깝게 만들어서 error값을 0으로 근접하게 만드는 것인데,
    그럼 noise 값이 싸인파형으로 되어야 되는거 아닌가요?
    즉 코드에서 보면 y_temp가 sin으로 되어야 되는거 아닌가요?
    그래프를 보면 error값이 sin값으로 가고 있는데 0으로 가야 되는거
    아닌가요..

    • 남성 2013.04.01 23:28 신고

      안녕하세요. 방문해 주셔서 감사합니다. ^^
      님이 맞습니다. ㅋㅋㅋ 정확한 지적이십니다.

      위에서 맨 마지막에 있는 그림 부분은 본문에도 밝혔지만, Demi 라는 분이 방명록에 한 질문에 대해 답변을 드린것이었습니다. 입출력 관계에 대해서만 설명을 드린것이지 그래프 결과가 정확한건 아닙니다. 질문한 당사자가 아닌 다른 분들한테는 오해의 소지가 있군요.

      신호대 잡음비 등을 고려하지 않은 예제기 때문에 위 예제는 LMS 알고리즘이 정상적으로 돌아가는 예제는 아닙니다.

      말씀하신대로 error 가 0 으로 가게 되는게 정상적인 LMS 알고리즘의 동작 입니다.

 

MATLAB 을 이용하여 다음과 같은 간단한 m 파일을 작성해 보겠습니다.

 

 

위 Editor 의 왼쪽 창은 test_file.m 파일이며 오른쪽에 있는 파일은 test_file.m 파일에서 이용한 MySin.m 함수 파일 입니다.

 

위 test_file.m 파일을 다른 사람에서 전달 한다면 당연히 test_file.m 파일과 MySin.m 함수 파일을 같이 전달해야 합니다.

 

위 예와 같이 함수가 하나인 경우에는 MySin.m 함수 파일을 빼 놓고 전달하는 경우가 없겠지만, 여러 사람이 같이 작업을 한다거나 또는 자신만의 library 를 작성하여 path 를 추가하여 이용하는 경우에는 주요한 함수들을 빼 놓고 전달해서 m 파일이 제대로 실행이 안 되는 경우가 종종 있습니다.

 

이런 경우에 Dependency Report 를 이용하면 현재 m 파일에서 이용하는 모든 함수들에 대한 path 를 알 수 있습니다.

 

Editor 창의 Tools > Show Dependency Report 를 클릭하면 다음과 같이 Dependency Report 가 나옵니다.

 

 

위 창으로부터 test_file.m 파일은 MySin.m 파일을 이용하고 있다는 것을 확인 할 수 있으며, MySin.m 파일의 위치는 current directory 에 있다는 것을 알 수 있습니다.

 

다른 사람들과 공동 작업을 할 때 Dependency Report 를 통해 사용되는 함수들에 대해 확인 후에 전달 한다면 주요 함수들을 빼 놓고 전달하는 실수를 줄일 수 있을 겁니다.


MATLAB Symbolic math toolbox 를 이용하면 공대생이라면 흔히 접하게 되는 상미분방정식(ordinary differential equations) 문제들을 굉장히 쉽게 풀 수 있습니다.

 

dsolve() 명령어를 이용하여 아래 ordinary differential equations 문제를 풀어 보도록 하죠.

 
 



 

dsolve() 함수를 이용하여 ordinary differential equation 을 풀 때 1차 미분은 D 로 표현을 합니다.

 

2차 미분은 D2로 표현을 하고 3차는 D3 로 표현을 하죠~

 

위 식에 대해 MATLAB 의 dsolve() 함수를 이용하여 풀 때는 다음과 같이 합니다.

 

S=dsolve('Dy+6*y=3*exp(-t)', 'y(0)=0')

 

그럼 다음과 같은 해가 나오죠.

 

S =

3/(5*exp(t)) - 3/(5*exp(6*t))

 

너무 간단하죠~


  

그럼 다음으로 좀더 복잡한 예를 들어보죠.

 

 

위 문제 역시도 다음과 같이 너무나 간단하게 풀 수 있습니다.

 

S=dsolve('2*D2y-2*Dy+y=0', 'y(0)=-1', 'Dy(1)=1')

 

해는 아래와 같이 나오는 군요.

 

S =

(sin(t/2)*exp(t/2)*(cos(1/2)*exp(1)^(1/2) - exp(1)^(1/2)*sin(1/2) + 2))/(cos(1/2)*exp(1)^(1/2) + exp(1)^(1/2)*sin(1/2)) - cos(t/2)*exp(t/2)

 


MATLAB 을 이용하여 다음과 같은 연립 방정식의 해를 구해 보죠.

 



위 식은 다음과 같이 matrix 의 형태로 나타낼 수 있습니다.

 

MATLAB 에서 연립방정식의 해를 구할때는 보통 \(back slash) 연산을 이용합니다.

 

A=[9 7 4; 5 16 8; 56 -2 21]; % A 값 정의

Y=[12 ; -23 ; 17]; % Y 값 정의

 

X=A\Y % x, y, z 의 해를 구함

 

위 식의 해는 다음과 같습니다.

 

X =

3.9347

2.0756

-9.4853

 

물론 다음과 같이 inv() 함수를 이용하여 구할 수도 있죠.

 

X_inverse=inv(A)*Y % inverse 함수를 이용하여 해를 구함

  

X_inverse =

3.9347

2.0756

-9.4853  


 

위 문제와 같이 A matrix 가 정방 행렬(square matrix) 이면서 nonsingular 인 경우라면 inv() 함수를 이용해도 \(back slash) 연산을 이용할 때와 동일한 결과가 나옵니다.

 

하지만 underdetermined 또는 overdetermined system 이라면 inv() 를 이용하여 해를 구할 수 없는 경우가 있습니다.

 

\(back slash) 연산은 underdetermined 또는 overdetermined system 인 경우에도 해를 구해 줍니다.

 

이때 해를 구하는 방식이 least square solution 형태의 해를 구해주는 겁니다.

 

least square solution 이란 norm(AX-Y)의 값이 최소가 되게 하는 X 값을 의미합니다.


 least square solution 을 구하는 일반적인 방법은 다음과 같으며 아래 식의 윗 첨자 H는 hermitian transpose 를 의미합니다.

 

윗 식을 matlab 명령어로 표현하면 다음과 같습니다.

 

 

hermitian transpose는 matlab에서 '(작은 따옴표)로 표현되며, matlab 에서는 윗식의 A+ 부분을 Moore-Penrose pseudoinverse of matrix 라 하며 MATLAB 에서는 pinv()라는 함수를 제공해 줍니다.

 

 

\ 연산을 이용하면 알아서 least square solution 을 구해 주기 때문에 , inv() 를 이용해서 해를 구하기 보다는 \ 를 이용하여 연립 방정식의 해를 구하는 것이 훨씬 더 편리 하고 바람직한 방법 입니다.


 

오늘 포스팅에서는 MATLAB 을 이용하여 Poisson r.v. 을 생성하고 이의 pmf 및 cdf, 평균 분산 등의 특징을 알아보도록 하겠습니다.

 

Poisson distribution은 특정 시간 동안의 이벤트 발생 확률 등을 나타내는데 주로 이용되는 r.v. 로서 다음과 같은 확률 질량 함수를 가지고 있습니다. 

 

cdf 는 다음과 같습니다. 

.

 

평균 및 분산 값은 λ 입니다.



 

cdf 식을 알았으니 이제 uniorm r.v. 을 발생시켜서 Poisson r.v. 을 발생 시킬 수 있을 겁니다.

 

λ = 4 일때의 poisson r.v. 을 생성하고 이에 대한 pmf 및 cdf 평균 및 분산을 구해 보도록 하겠습니다.

 

코드는 다음과 같습니다.

 

 



 

command 창에 나온 평균 및 분산 결과는 다음과 같고 이론적인 평균 및 분산 값인 λ = 4 와 근사적으로 일치 함을 확인 할 수 있습니다.

 

 



 

pmf 및 cdf 는 다음과 같이 나옵니다.

 

 


오늘의 포스팅에서는central limit theorem (중심 극한 정리)에 대한 MATLAB 시뮬레이션에 대해 설명 드립니다.

 

저 개인적으로는 중심 극한 정리에 대해 이해를 하면 왜 가우시안 분포를 정규분포라고도 하는지 이해를 하게 된 것 같습니다.

 

중심 극한 정리란 어떤 임의의 확률 변수의 합의 횟수가 무한대가 될 때 그 분포가 정규 분포에 가까워진다는 것입니다.

 

 

위 식을 보면서 좀더 쉽게 설명 드리자면 위 식의 Xi 라는 변수가 어떤 분포를 갖는 변수던지 간에 N 값이 무한대가 되도록 더하면 SN 이라는 확률 변수의 분포가 정규 분포가 된다는 겁니다.

 

특정 r.v. 합에 대한 평균 분산은 다음 수식과 같은 특징이 있습니다.

 

 

 

평균이 μ 이고 분산이 σ2인 정규 분포의 pdf 다음과 같습니다.

 

 



 

이제 central limit theorem 시뮬레이션을 해 보죠.

 

Xi 는 간단하게 uniform r.v. 을 이용해 보죠. MATLAB 의 rand() 함수를 이용하시면 됩니다.

 

uniform r.v. 을 이용하여 SN 만들었다면 값의 이론적인 평균 분산 값을 계산해야 합니다.

 

rand() 함수는 일단 0~1 사이의 uniform 한 값을 반환 하므로 다음과 같은 평균 및 분산 값을 갖습니다.

 

 

 

그 합인 SN 의 평균 및 분산은 다음과 같겠죠.

 

 

 



 

위 값들을 바탕으로 N= 100 인 경우의 central limit theorem 에 대한 시뮬레이션을 수행해 보겠습니다.

 

코드는 다음과 같습니다.

 

 

 

위 코드에서 정규분포의 pdf 및 cdf계산을 위해 이용한normpdf(), normcdf() 함수는 Statistics Toolbox 에 포함된 함수 입니다.

 

위 코드를 수행해서 나온 command 창의 결과를 보면 아래 결과와 같으며 이는 이론적인 평균 (100/2 = 50 )및 분산(100/12=8.3333) 값과 일치함을 확인 할 수 있습니다.

 

 

pdf 및 cdf 의 그래프는 다음과 같습니다.

 

 

 

central limit theorem 시뮬레이션 수행 결과 이론적인 정규분포와 정확히 일치 함을 확인 할 수 있습니다.


  1. 2017.06.06 17:56

    안녕하세요.. 그대로 작성했는데 첨자 인덱스 오류가 나네요

MATLAB 의 symbolic math toolbox를 이용하면 합성 함수나 역함수 등을 매우 쉽게 구할 수 있습니다.

 

합성 함수를 구해주는 함수로는 compose()라는 함수가 있습니다.

 

다음 식에 대해 간단히 합성 함수를 구해 보죠.

 

,

 

위 식에 대한 합성 함수f(g(x)) 다음과 같습니다.

 

syms x

f= x^2+2*x+3;               % f(x)

g= sin(x);                   % g(x)

fg=compose(f,g)          % f(g(x))

ezplot(fg), grid on        % f(g(x)) 그래프

 

결과는 다음과 같습니다.

 

fg =

sin(x)^2 + 2*sin(x) + 3

 
 

 



 
 

다음으로 역함수를 구해주는 함수인 finverse() 함수에 대해 알아보죠.

 

 

위 식에 대한 역 함수를 구하려면 다음과 같이 코딩 하시면 됩니다.

 

syms x t

finverse(log(2*x+t), x)       % x 에 대한 역함수

finverse(log(2*x+t), t)        % t 에 대한 역함수

 

각 역함수의 결과는 다음과 같습니다.

 

ans =

exp(x)/2 - t/2

 

ans =

exp(t) - 2*x

 


오늘의 포스팅에서는 function handle 사용법의 추가 적인 내용들에 대하여 정리하겠습니다.

 

여러 함수에 대해 똑 같은 값을 적용할 때에는 function handle 을 struct classcell class 의 형태로 만들어서 이용할 수가 있습니다.



다음 수식에 대하여 struct 의 형태로 function handle 을 구성하고 그에 따른 값을 알아보죠.

 



 

다음과 같이 struct 의 형태로 표현 할 수 있고, x=-1:0.5:1 에 대한 각 수식의 값을 한번에 구할 수가 있습니다.

 

struct 에 한번에 똑 같은 값 또는 함수 등을 적용 할 때는 structfun() 함수를 이용 합니다.

 

 

위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.

 

ans =

f: [1 0.2500 0 0.2500 1]

g: [-1 -0.1250 1 3.1250 7]

h: [-0.8415 -0.4794 0 0.4794 0.8415]

  


 

위 수식에 대하여 cell 의 형태로 표현하고 위 x 의 범위에 대한 값을 구해 보죠.

 

cell 에 한번에 똑 같은 값 또는 함수 등을 적용 할 때는 cellfun() 함수를 이용 합니다.

 

 

위 코드에 따른 결과는 다음과 같습니다.

 

D{1} =

1.0000 0.2500 0 0.2500 1.0000

D{2} =

-1.0000 -0.1250 1.0000 3.1250 7.0000

D{3} =

-0.8415 -0.4794 0 0.4794 0.8415

  


 

마지막으로 function handle 을 두 번 이용해서 다음 수식을 표현해 보겠습니다.

 

 

적분은 quad() 함수를 이용하겠습니다.

 

quad() 함수의 사용 방법에 대해서는 아래 포스팅을 참조 하시기 바랍니다.

   

 

@ 을 두 번 써서 위 식을 표현 할 수 있습니다.

 

f = @(a,b) (quad(@(x) (x.^2 + b*x + 4), 0, a))

 

임의의 a, b 값에 대해 다음과 같은 결과가 나오는 것을 확인 할 수 있습니다.

 

>> f(1,2)

ans =

5.3333

 

>> f(4,0)

ans =

37.3333

 


MATLAB 에서 미분 방정식에 대한 해를 구하는 여러 방법 중 수치적인 해를 구할 때 주로 ode23(), ode45() 와 같은 함수를 이용한다.

 

odeordinary differential equation 의 약자이다.

 

뒤에 붙은 23이나 45 같은 숫자는 Runge-Kutta formulas 의 차수를 말한다.

 

ode23 은 2차 3차 Runge-Kutta 방식을 이용하는 것이고,

 

ode45 은 4차 5차 Runge-Kutta 방식을 이용하는 것이다.


  

문제의 유형에 따라 몇 차의 Runge-Kutta 방식을 이용해야 할지 결정 해야 한다.

 

문제의 유형이 stiff, nonstiff 인지 그리고 해의 정확도 가 High 인지 Low 인지에 따라 solver 의 선택을 달리 해야 한다.

 

언제 어떤 solver 를 선택해야 하는지는 다음 페이지를 보면 자세히 나와 있다.

 

http://www.mathworks.com/help/techdoc/ref/ode23.html

 

보통의 경우엔 ode45를 사용하곤 한다.

 

ode45() 함수의 일반적인 사용법은 다음과 같다.

 

[T,Y] = solver(odefun,tspan,y0)

 

odefun : 풀고자 하는 ordinary differential equation 함수의 handle 을 입력한다.

 

tspan : 시간 구간을 입력한다. 일반적으로는 [t0(초기값), tf(끝 값)] 을 입력하며, 때로는 [t0, t1, t2,…, tf] 와 같은 형태로 중간의 값들을 지정해 주기도 한다.

 

y0 : 해의 초기 상태를 의미 한다.

 

T : 시간이 나온다.

 

Y : 해가 출력 된다. 



오늘의 포스팅에서는 ode45() 를 이용하여 물통의 수량에 대한 문제를 풀어보려 한다.

 

 

위 문제에서 각 물통의 물의 높이 h1, h2, h3 는 다음과 같은 미분 방정식으로 표현된다.

 

위 식에서 A=3, qi = 15, C=5 이다.

 

qd 값은 0 ~ 4 초 동안 0 이다가 4초가 되는 순간부터 9 초까지 qd = 20 이고 10초 이후에는 다시 qd = 0 이 된다고 하자.

 

h1 의 초기값은5 , h2 의 초기값은5, h1 의 초기값은0 이다.

 

위와 같은 경우의 정상 상태에서의 각 물통의 물의 높이를 구해 보자.

 

일단 위 식에 따라 미분 방정식 함수는 다음과 같다.

function dhdt = mass_balance(t,h)

 

global C A qd qi % 각 변수를 global 로 설정

 

dhdt = zeros(3,1); % 출력 버퍼 설정

 

dhdt(1) = qi/A - C*sqrt(h(1))/A; % 첫번째 물통

 

dhdt(2) = qd/A + C*sqrt(h(1))/A - C*sqrt(h(2))/A; % 두번째 물통

 

dhdt(3) = C*sqrt(h(2))/A - C*sqrt(h(3))/A; % 세번째 물통

 

위 문제에 대한 풀이 코드는 아래와 같다.

 

 

100 초 까지 시뮬레이션 결과 각 물통의 물의 높이는 아래와 같이 됨을 확인 할 수 있다.

 

steady state h value: 9 , 9 , 9

 


  1. 장누리 2016.11.12 00:08

    안녕하세요. 좋은 글 잘봤습니다. 저는 생물공정에 대해서 공부하는 대학원생 입니다. 현재 제가 운영하는 생물 반응 시스템을 수치적으로 시뮬레이션하기위해서 전산 프로그램을 공부중인데요..문제는 이러한 전산 프로그램에 대한 기초가 전혀 없습니다.. 학교에서 제공하는 매스매티카를 설치해서 조금씩 공부해본 결과 간단한 ( 제가 말하는 간단한이란 의미는 dxdt 가 딱 한 종류만 있는) 미분방정식을 풀고 그래프화하는 방법까지는 알아냈습니다. 하지만 제가 시뮬레이션해야 할 시스템은 dxdt,,dydt,dzdt... 이런식으로 파라미터들이 거의 6,7 개 정도가 되며 각각의 변화량이 다른 파라미터들의 함수가 되는 형태입니다. 또 한 종류의 파라미터는 시간에 대한 함수가 아니라 다른 파라미터 값에 대한 함수인데... 어디서부터 손을 대야 할 지 잘 모르겠습니다.. 사실 지금 위의 시스템을 엑셀 파일로 구현을 하는데에는 성공했습니다만.. 좀 더 편하게 매트랩이나, 매스매티카 같은 툴을 이용해서 쉽게 풀고 GUI를 만들고 싶습니다.. 혹시 도움을 얻을 수 있을까요? ...

    • 남성 2016.11.12 00:33 신고

      구현하면서 MATLAB 사용과 관련하여 궁금한 부분이 있다면 답변은드릴 수 있지만 구현을 대신 해 드릴수는 없습니다.

  2. 이태빈 2018.05.13 18:06

    mass_balance 함수에서 입력 인자로 t,h를 쓰는데 함수 구현부에서 t가 왜 안쓰이는 지 궁금합니다.

    • 남성 2018.05.13 20:49 신고

      원래 mass_balance 함수에서는 위 수식을 보시면 변수 t 값을 사용하지 않았습니다.그런데 ode45 를 사용하기 위해서는 첫번재인자가 함수 핸들인경우 tspan 을 넣어줘야 하기 때문에 mass_balance 함수에 첫번째 인자로 t 값을 준 것입니다.

  3. 김진희 2018.11.08 11:20

    궁금한 것이 있는데요, 보니까 ode45의 미분방정식을 푸는데 t를 1~100의 벡터로 놓고,

    1과 2사이를 0.2씩 5구간으로 나눠서 for문으로 100번 반복하여 풀던데요,


    아예 처음부터 ode45함수에 500구간을 모두 넣지 않고, 5구간 씩 for문으로 100번 반복하게 하신 이유는 무엇인가요?


    저는 다음과 같이 풀었습니다.


    global C A qi

    % 출처: http://iamaman.tistory.com/71

    C = 5;
    A = 3;
    qi = 15;

    t = 0 : 0.2 : 100;

    h0 = [5 5 0];


    [t,h] = ode45 (@mass_balance, t, h0);

    figure, plot(t, h), grid on, legend('h1','h2','h3')

    fprintf('steady state h value: %g , %g , %g \n',h(end,:))


    여기서 qd는 qd.m파일을 만들어서 mass_balance.m파일에서 불러다 쓰는 함수로 만들어 놓았습니다.


    여기에 답변해주신다면 고맙겠습니다.

    doskid2@naver.com

  4. 김진희 2018.11.08 11:50

    문제를 다시 읽어보니까 for문을 쓰신 이유는 h값이 시간에 따라 변하기 때문이신것 같아요.

    이렇게 접근해보니까 for문을 100번 돌리는 것보단 아예 t를 0.2씩 증가시켜가며 500번 돌리는 것이 더 정확할 것 같아요.

  5. 김진희 2018.11.08 17:03

    변형시켜서 해보니까 님의 해법이 모범예시였군요.
    감사합니다.

MATLAB 의 함수는 종종 입력과 출력 argument 의 수가 가변적인 경우가 많습니다.

 

x=magic(3)

 

위에서 선언한 변수 x 에 대하여 다음과 같이 max() 함수를 이용할 수 있습니다.

 

s=max(x)

s1=max(x, 3)

[s2 n]=max(x)

 

위 코드를 보면 max() 함수를 이용하는데 x 라는 입력 하나만 줄 수도 있고, x,3 이라는 두 가지 입력을 줄 수도 있고, [s2 n]이라는 2개의 인자가 출력이 되게 할 수도 있습니다.

 

MATLAB 에서 함수의 가변적인 입출력을 가능하게 하는 keyword 가 nargin, nargout 입니다.

 

nargin 은 함수에 입력되는 인자의 수를 말하며, nargout은 함수의 출력의 수를 말 합니다.



 

그럼 예를 들어 설명해 보도록 하죠.

 

다음 코드와 같이 a,b,c 의 입력을 받고 합과 차를 반환하는 함수 my_func() 함수를 nargin, nargout 을 이용하여 만들어 보도록 하겠습니다.

 

function [x y] = my_func(a, b, c)

 

disp(['입력 변수의 수 ' num2str(nargin)]);

 

if (nargin==1) % 입력 인자의 갯수가 1 이면

b=0; % b=0 으로 설정

c=0; % c=0 으로 설정

elseif (nargin==2) % 입력 인자의 갯수가 2 이면

c=0; % c=0 으로 설정

end

 

disp(['출력 변수의 수 ' num2str(nargout)]);

 

 

if nargout==1 % 출력의 갯수가 1개 이면 합을 반환

x=a+b+c;

elseif nargout==2 % 출력의 갯수가 2개 이면 합과 차를 반환

x=a+b+c;

y=a-b-c;

end

 

위 코드의 실행 결과는 다음과 같습니다.

 

 

 

입력과 출력의 수에 따라 적절한 결과를 표시하는 것을 알 수 있습니다.


  1. 캄사 2012.05.07 21:32

    유용한 정보 잘 배워갑니당 ㅎ

  2. Xeonia 2012.05.21 16:29

    매틀랩 배우기 시작했는데 정말 많은 게 있네요 ㅠㅠ
    자주 찾아오겠습니다 감사합니다 ㅎ

  3. 쿠조 2012.05.27 11:49

    아 정말 유용하네요 감사해요~

오늘의 포스팅에서는 선형 시스템 해석에 주로 사용되는 Laplace transform 에 대해 알아 보겠습니다.

 

임의의 함수 f(x)에 대한 Laplace transform 의 정의는 다음과 같습니다.

 

 

그리고 inverse Laplace transform 은 다음과 같죠.

 

 

MATLAB symbolic math toolbox 를 이용하면 위 식과 같은 Laplace transform 또는 inverse Laplace transform 을 매우 쉽게 할 수 있습니다.

 

Laplace transform 은 laplace() 라는 함수를 이용하고, inverse Laplace transform 은 ilaplace() 라는 함수를 이용합니다.



 

간단하게 몇 가지 예를 들어 보죠.

 

 

가장 기본적인 위 식에 대해 Laplace transform 을 수행해 보죠.

 

코드는 다음과 같습니다.

 

syms k a t real % 변수 선언

 

laplace(sym('1')) % 1 에 대한 Laplace transform

laplace(sin(k*t)) % sin(k*t) 에 대한 Laplace transform

laplace(exp(a*t)) % exp(a*t) 에 대한 Laplace transform

 

위 코드 실행 결과는 다음과 같습니다.

 

 



 

다음으로 inverse Laplace transform 을 몇 가지 해 보죠~

 

 

syms s                % 변수 선언

syms a b t real      % 변수 선언

 

f=s/(s^2+a^2)

d=ilaplace(f) % inverse laplace transform

 

f=1/((s-b)^2+a^2)

d=ilaplace(f) % inverse laplace transform

 

f=s/(s^2-a^2)

d=ilaplace(f) % inverse laplace transform

 

위 코드의 실행은 다음과 같습니다.


MATLAB 을 사용하다 보면 특정 변수를 파일로 저장하고 싶은 경우가 있습니다.

 

다음과 같은 경우를 보죠.


 

 

 

이라는 함수 f 를 function handle 로 정의 하고 x=1:10 에 따른 y 값을 구했습니다.

 

위 함수 f 와 , y 값을 파일로 저장해서 나중에 다시 사용하고 싶다면 다음과 같이 save 명령어를 이용하여 mat 파일로 저장 하시면 됩니다.

 

 

확인을 위해 clear 명령을 통해 workspace 에서 변수를 지운 다음에

 

load fy.mat 이라는 명령어를 통해 파일을 읽어 들이면 f, y 라는 변수가 그대로 workspace 에 load 되는 것을 확인 할 수 있습니다.


'programming language > MATLAB' 카테고리의 다른 글

MATLAB function handle 추가  (0) 2011.04.25
MATLAB ordinary differential equation , ode45  (8) 2011.04.24
MATLAB nargin, nargout  (6) 2011.04.24
MATLAB laplace, inverse laplace transform  (0) 2011.04.24
MATLAB 변수를 저장 하자~ mat file  (0) 2011.04.21
MATLAB NaN  (0) 2011.04.20
MATLAB 파일 출력  (0) 2011.04.19
MATLAB 파일 읽기 importdata()  (0) 2011.04.18
MATLAB binomial r.v. generation  (4) 2011.04.17

MATLAB 의 NaN키워드는 Not-a-Number 의 약자입니다.

 

즉 숫자가 아니라는 뜻입니다.

 

0/0 이나 ∞/∞ 와 같은 경우 NaN 이 출력 되게 되는데, 보통은 쓸모가 없다라고 생각하곤 합니다.

 

하지만 이런 NaN 키워드는 그래프를 그릴 때 매우 유용하게 사용할 수 있습니다.

 

그래프에서 특정 부분을 그래프에 나타내고 싶지 않을 때는 NaN 을 이용해서 표현을 하면 됩니다.

 



 

다음과 같은 경우를 보죠.

 

x=1:10;

y=x*2;

figure, plot(x,y), grid on

y2=y; y2(y>10)=nan; % y 의 값중 10 보다 큰 값들은 nan 으로 설정

figure, plot(x,y2), grid on

 

위 코드는 y 의 값 중에서 10 보다 큰 값들은 NaN 을 이용하여 그래프에서 제거 해주었습니다.

 

 



 

다음과 같이 3 차원 그래프에서 NaN 을 이용해 보죠.

 

[x y] = meshgrid(-8:0.5:8);

r = x.^2 + y.^2;

mesh(x,y,r), xlabel('x'), ylabel('y'), zlabel('z')

grid on

 

위 코드의 결과 다음과 같은 그래프가 그려 집니다.

 

 

r2=r;

index=(x<0) & (y>0);

r2(index)=nan; % x<0 and y>0 인 부분을 지운다.

mesh(x,y,r2), xlabel('x'), ylabel('y'), zlabel('z')

grid on

 

위 코드와 같이 nan 을 이용하여 x <0 이고 y > 0 인 부분을 그래프에서 쉽게 지울 수가 있습니다.

 


'programming language > MATLAB' 카테고리의 다른 글

MATLAB ordinary differential equation , ode45  (8) 2011.04.24
MATLAB nargin, nargout  (6) 2011.04.24
MATLAB laplace, inverse laplace transform  (0) 2011.04.24
MATLAB 변수를 저장 하자~ mat file  (0) 2011.04.21
MATLAB NaN  (0) 2011.04.20
MATLAB 파일 출력  (0) 2011.04.19
MATLAB 파일 읽기 importdata()  (0) 2011.04.18
MATLAB binomial r.v. generation  (4) 2011.04.17
MATLAB cell class  (6) 2011.04.11

MATLAB 에서 txt 파일을 출력하는 경우 다음 과정에 따라 처리 한다.

 

  • fopen() 함수를 이용하여 파일을 쓰기 모드('w')로 연다.

 

  • fprintf() 함수를 이용하여 파일에 내용을 쓴다.

   

  • fclose() 를 이용하여 file handle 을 닫아 준다.

  



 

다음과 같은 데이터를 이용하여 위 과정 대로 test_file.txt 파일에 저장해 보자.

 

 

저장하는 과정은 다음 코드와 같다.

 

 

 

저장된 파일 test_file.txt 을 열어서 확인해 보면 다음과 같다.

 

7 8 

3 7 

7 1 

1 5 


위 결과를 보면 정상적으로 저장이 안 된 것을 확인 할 수 있다.



 

이는 fprintf 함수에서 %d %d 를 써서 10진수 숫자를 저장할 때

 

각 열 벡터 별로 즉 MATLAB 이 일반적으로 처리하는 행 순서대로 저장하기 때문이다.

 

따라서 matrix 값을 정확히 저장하기 위해서는 transpose 를 취해준 후 저장 해야 한다.

 

fprintf() 문장의 올바른 코드는 다음과 같다.

 

fprintf(file_h,'%d %d \n', x.'); % 10진수 이므로 %d 사용

 


텍스트 파일을 열어서 결과를 확인하면 다음과 같이 정상적으로 저장 된 것을 확인 할 수 있다.

 

7 7 

8 1 

3 1 

7 5  

    


'programming language > MATLAB' 카테고리의 다른 글

MATLAB nargin, nargout  (6) 2011.04.24
MATLAB laplace, inverse laplace transform  (0) 2011.04.24
MATLAB 변수를 저장 하자~ mat file  (0) 2011.04.21
MATLAB NaN  (0) 2011.04.20
MATLAB 파일 출력  (0) 2011.04.19
MATLAB 파일 읽기 importdata()  (0) 2011.04.18
MATLAB binomial r.v. generation  (4) 2011.04.17
MATLAB cell class  (6) 2011.04.11
MATLAB taylor, Maclaurin serise  (0) 2011.04.10

오늘의 포스팅에서는 importdata() 함수를 이용하여 파일을 읽는 방법에 대해 알아보겠습니다.

 

data.txt 파일이 다음과 같이 구성되어 있을 때





x 1 2 3 4 5 6

y 2 4 6 8 10 12

 

아래 그림처럼 데이터를 load 할 수가 있습니다. 

 

위 코드를 보면 importdata() 함수의 결과는 struct class 형태로 구성되는 것을 알 수 있고

 
 

알아서 수치 데이터는 수치 데이터끼리 문자로 된 header는 header 끼리 필드를 구분해서 저장 하는 것을 확인 할 수 있습니다.


'programming language > MATLAB' 카테고리의 다른 글

MATLAB laplace, inverse laplace transform  (0) 2011.04.24
MATLAB 변수를 저장 하자~ mat file  (0) 2011.04.21
MATLAB NaN  (0) 2011.04.20
MATLAB 파일 출력  (0) 2011.04.19
MATLAB 파일 읽기 importdata()  (0) 2011.04.18
MATLAB binomial r.v. generation  (4) 2011.04.17
MATLAB cell class  (6) 2011.04.11
MATLAB taylor, Maclaurin serise  (0) 2011.04.10
MATLAB 그래프에 값 넣기 추가, gtext()  (0) 2011.04.09

지난 포스팅에서 bernoulli r.v. generation 에 대해 설명 드린 바 있습니다.

 
2011/04/06 - [MATLAB] - MATLAB Bernoulli random variable generation

 

오늘은 그 연장선상으로 binomial r.v. generation에 대해 설명 드리겠습니다.

 

binomial distribution은 이항 분포라고 하는데, 한번의 시행에서의 성공 확률이 p 인 경우 n 번의 시행에서 k 번 성공할 확률을 의미 합니다.

 

 



 

이렇게 말하니깐 잘 이해 못하시겠다면, 주사위의 예를 들면 이해 하기 편하실 것 같습니다.

 

주사위를 던져서 숫자 1이 나올 확률은 1/6 이죠. 10 번 던져서 k 번 만큼 숫자 1이 나올 확률이 이항 분포로 다음 식과 같이 표현 됩니다.

 

 

위 식에 k=0 ~ 10 의 값을 대입하면 pmf 값을 구할 수가 있죠.

 

그리고 pmf 를 누적 해서 합 하면 cdf 값이 되죠.

 

cdf 값이 있으면, uniform r.v. 를 사용하여 binomial r.v. 를 생성 할 수 있는 것이죠.

 



 

이에 대한 MATLAB 코드는 다음과 같습니다.

 

 



 

위 코드에 따른 binomial pmf 및 cdf 는 다음과 같습니다.

 

 



 

이제 위 코드 예에 대한 이론적 평균 및 분산을 구해 보죠.

 

이론적 평균 np= 10*1/6 = 1.6667 이고

 

이론적 분산 np(1-p) = 10*1/6*5/6=1.3889 입니다.

 

위 코드에 의해 생성된 binomial r.v.의 평균 및 분산은 다음과 같이 위 이론적 결과와 근사적으로 일치 함을 확인 할 수 있습니다.

 

 


'programming language > MATLAB' 카테고리의 다른 글

MATLAB 변수를 저장 하자~ mat file  (0) 2011.04.21
MATLAB NaN  (0) 2011.04.20
MATLAB 파일 출력  (0) 2011.04.19
MATLAB 파일 읽기 importdata()  (0) 2011.04.18
MATLAB binomial r.v. generation  (4) 2011.04.17
MATLAB cell class  (6) 2011.04.11
MATLAB taylor, Maclaurin serise  (0) 2011.04.10
MATLAB 그래프에 값 넣기 추가, gtext()  (0) 2011.04.09
MATLAB 그래프에 값 넣기  (0) 2011.04.09
  1. 궁금 2016.12.03 18:29

    rv를 통해 pdf와 cdf를 plot할 때 히스토그램을 이용하는 이유는 무엇인가요? 그냥 plot함수를 써서 나타낼 수는 없나요?

    • 남성 2016.12.04 00:12 신고

      위 포스팅에서도 hist 를 사용해서 그림을 그린건 아니죠. 그림은 stem() 함수를 사용했고 hist 는 말 그대로 히스토그램을 구하기 위해 사용한 겁니다.

    • 궁금 2016.12.04 20:07

      pmf에 buffer가 필요한 이유는 뭔가요??

    • 남성 2016.12.04 23:53 신고

      PMF 값을 저장하기 위한거죠.

 

MATLAB 에는 약간 독특한 cell 이라는 class 가 존재 합니다.

 

cell class 는 타입을 안 가리고 다 저장 하거든요.

 

숫자 문자를 가리지 않고 하나의 변수로 관리 할 수 있습니다.

 

struct class 처럼 field 로 구분하는 것도 아닌 게 한 변수에 막 집어 넣으니깐 처음에는 참 신기하더군요.

 

perl 을 접하신 분은 '당연한 거 아냐?' 하실 지도 …..

 

아무튼 이 cell 타입이라는 게 나중에는 참 쓸모가 많아 지니깐, 알아 두시면 도움이 됩니다.

 

아!! 여담으로 MATLAB 에서 perl script 도 실행이 가능 합니다.

 

MATLAB 에서 perl() 함수를 찾아 보시길~ 이런 것도 되? 하면서 좋아하실 분들도 있을 거라 생각 됩니다. 아닌가? ㅡㅡ;

   


 

cell class 의 변수를 설정 하는 방법은 다음과 같이 두 가지 방법이 있습니다.

 

  • 중괄호 {} 를 이용하는 방법

 

A={1:10, 'abc'; zeros(3), 'cell'}

A =

[1x10 double] 'abc'

[3x3 double] 'cell'

 

 

  • cell() 함수를 이용하는 방법

 

A=cell(2)

A=cell(2,2)

A =

[] []

[] []

 

위 명령들은 A 를 2행 2열의 empty cell로 만들어 줍니다.



 

cell A 의 각 인자에 값을 넣을때는 다음과 같이 표현 합니다.

 

A{1, 2}='1 row 2 column'

A =

[] '1 row 2 column'

[] []

 

 

위 코드는 A 의 1 행 2열에 문자열을 입력한 경우 입니다. matrix 에서는 각 인자의 값에 접근 할 때 ()괄호를 이용하였지만, cell class 에서는 중괄호를 이용한다는데 주의 하셔야 합니다.

 

괄호를 이용하여 A 의 2행 2열에 값을 입력하고 싶을 때는 다음과 같이 표현해야 합니다.

 

A(2, 2)={1:10} % 등호 우측에 중괄호를 이용하여 cell 을 넣어줌

A =

[] '1 row 2 column'

[] [1x10 double]

 

괄호를 이용하여 다음과 같이 접근 해 보죠.

 

A={1:10, 'abc'; zeros(3), 'cell'}

A =

[1x10 double] 'abc'

[3x3 double] 'cell'

 

B=A(1,2) % A 의 1 행 2열 에 괄호를 이용

B =

'abc'

 

class(B)

ans =

cell

 

B 는 cell class 의 값 입니다.

 

즉 B = {'abc'} 라고 표현한 것과 같은 것입니다. 



 

cell 에는 어떤 타입이든 담을 수 있기 때문에 cell 안에 cell을 담을 수도 있습니다.

 

A={1:10, 'abc'; zeros(3), 'cell'}

A =

[1x10 double] 'abc'

[3x3 double] 'cell'

 

B=cell(2)

B =

[] []

[] []

 

B{1,1}=A % B 의 1행 1열에 cell A 를 입력

B =

{2x2 cell} []

[] []

 

B{2,2}=ones(3)

B =

{2x2 cell} []

[] [3x3 double]

 

 

cell 안에 어떤 내용이 담겨 있나 구체적으로 알고 싶을 때는 cellplot() 함수를 이용하면 시각적으로 볼 수 있습니다.

 

cellplot(B,'legend')

 

celldisp() 함수를 이용하면 단순히 command 창에 그 값들을 나열하게 됩니다.

 

celldisp(B)

B{1,1}{1,1} =

1 2 3 4 5 6 7 8 9 10

B{1,1}{2,1} =

0 0 0

0 0 0

0 0 0

B{1,1}{1,2} =

abc

B{1,1}{2,2} =

cell

B{2,1} =

[]

B{1,2} =

[]

B{2,2} =

1 1 1

1 1 1

1 1 1

 



 

cell B 의 1행 1열안의 2행 2열에 있는 cell 이라는 문자열에 접근 하기 위해서는 다음과 같이 표현 하면 됩니다.

 

B{1,1}{2,2}

ans =

cell

 

 

cell 이라는 문자열의 2번째 글자인 e 를 나타내려면 다음과 같이 입력하면 됩니다.

 

B{1,1}{2,2}(2)

ans =

e

 



 

이제 cell A,B 를 C 라는 cell 에 넣어 볼까요...

 

C={A, B}

C =

{2x2 cell} {2x2 cell}

 

size(C)

ans =

1 2

 

C는 1행 2열의 cell 이 됩니다.

 

C={A ; B}

C =

{2x2 cell}

{2x2 cell}

 

size(C)

ans =

2 1

 

이렇게 하니깐 C 가 2행 1열의 cell 이 되죠.

 



 

그럼 2행 2열의 cell A와 2행 2열의 cell B 를 붙여서 4 행 2열을 만들고 싶으면 어떻게 해야 될까요.

 

이럴 때는 대괄호를 이용합니다.

 

D=[A B]

D =

[1x10 double] 'abc' {2x2 cell} []

[3x3 double] 'cell' [] [3x3 double]

 

D=[A ; B]

D =

[1x10 double] 'abc'

[3x3 double] 'cell'

{2x2 cell } []

[] [3x3 double]

 



 

: 콜론을 이용하여 cell D 에 다음과 같이 값을 할당 해 보죠.

 

D(:,1)={1, 2, 3, 4}

D =

[1] 'abc'

[2] 'cell'

[3] []

[4] [3x3 double]

 

위와 같은 표현은 구버전의 MATLAB 을 이용하시는 분들은 실행이 안 될 수 있습니다.

 

그럴 때는 deal() 함수를 이용하시면 됩니다.

 

[D{:,1}]=deal(1,2,3,4)

D =

[1] 'abc'

[2] 'cell'

[3] []

[4] [3x3 double]

 



 

콜론을 이용하여 cell 의 값을 반환하는 예를 보죠.

 

f=D{:,1}

f =

1

 

위 코드는 이상하게도 1 만 나오죠?

 

1, 2, 3, 4를 벡터로 나타낼 때는 다음과 같이 합니다.

 

f=cell2mat(D(:,1))

f =

1

2

3

4

 

cell2mat() 함수는 cell class 를 matrix 로 만들어 줍니다.

 

matrix 를 cell 로 만들어 줄 때는 mat2cell() 이라는 함수를 이용합니다.

 

A=magic(2)

A =

1 3

4 2

 

G=mat2cell(A,2,2)

G =

[2x2 double]

 

celldisp(G)

G{1} =

1 3

4 2

 

size(G)

ans =

1 1

 

위 결과를 보면 G 의 크기가 1행 1열이죠? 2 행 2열로 나타내고 싶은데 말이죠..

 

다음과 같이 하면 원하는 결과를 얻을 수 있습니다.

 

G2=mat2cell(A,[1 1],[1 1])

G2 =

[1] [3]

[4] [2]

 

size(G2)

ans =

2 2

 

숫자만으로 구성된 matrix 를 cell 로 표현 할 때는 num2cell() 함수를 사용하는 게 좀 더 편리 합니다.

 

G3=num2cell(A)

G3 =

[1] [3]

[4] [2]

 

size(G3)

ans =

2 2



  1. 샤오 2011.10.22 01:26

    A*x=b, A는 2*2 단순 숫자로 구성된 행렬, b는 2*1 단순 숫자로 구성된 행렬, A의 inverse를 구하여 b와 곱해 x를 구하는 소스좀 알켜주세요. R2011b 인데 잘안되네요.

  2. 남성 2011.10.22 21:08 신고

    방문해 주셔서 감사합니다.

    x = inv(A)*b

    또는

    x=A\b 하셔도 됩니다.






  3. 용마담 2012.01.13 15:20

    좋은 정보 감사합니다.
    매트랩에서 늘 매트릭스로 만들어서 변수들을 저장하는 방법만 쓰다보니 문자열 저장이 안 되서 좌절했었는데,
    cell 개념을 쓰면 되는군요. 애용하렵니다ㅎㅎ

  4. 올스파크 2014.05.09 16:03

    좋은 정보 감사히 잘 보고 갑니다~

taylor serise 는 특정 지점에서의 미분 값들의 무한 합을 통하여 함수를 표현 할 수 있다는 것이다.

 

정의는 다음과 같이 된다.

 

 

특정 지점 a=0 인 경우를 Maclaurin series 라고 한다.

 

MATLAB 을 이용하여 이와 같은 taylor series expansion을 구할 때는 taylor() 함수를 이용한다.

 

taylor() 함수는 symbolic math toolbox 가 있어야 쓸 수 있는 함수이다.



 

다음 함수 에 대한 taylor series expansion을 알아보자.

 

 

다음과 같이 위 함수를 정의 한다.

 

syms x

 

f=log(1+x)

 

f =

         log(x + 1)

 

 

  • f1=taylor(f) 라고 하면 5차의 Maclaurin series expansion 결과를 반환 한다.

    f1 =

    x^5/5 - x^4/4 + x^3/3 - x^2/2 + x

     

  • f2=taylor(f, 10) 라고 하면 10 - 1=9 차의 Maclaurin series expansion 결과를 반환 한다.

    f2 =

    x^9/9 - x^8/8 + x^7/7 - x^6/6 + x^5/5 - x^4/4 + x^3/3 - x^2/2 + x

 

  • f3=taylor(f, 0.2) 라고 하면 a=0.2 , 5차의 taylor series expansion 결과를 반환 한다.

    f3 =

    (5*x)/6 + log(6/5) - (25*(x - 1/5)^2)/72 + (125*(x - 1/5)^3)/648 - (625*(x - 1/5)^4)/5184 + (625*(x - 1/5)^5)/7776 - 1/6

 

  • f4=taylor(f, 10, 0.2) 라고 하면 a=0.2 , 9차의 taylor series expansion 결과를 반환 한다.

    f4 =

    (5*x)/6 + log(6/5) - (25*(x - 1/5)^2)/72 + (125*(x - 1/5)^3)/648 - (625*(x - 1/5)^4)/5184 + (625*(x - 1/5)^5)/7776 - (15625*(x - 1/5)^6)/279936 + (78125*(x - 1/5)^7)/1959552 - (390625*(x - 1/5)^8)/13436928 + (1953125*(x - 1/5)^9)/90699264 - 1/6

 

 


 

MATLAB 에는 taylor serise expansion 을 좀더 쉽게 할 수 있는 GUI tool 도 제공해 준다.

 

command 창에 taylortool 이라고 입력하면 다음과 같은 GUI 창이 뜨게 되며 argument 변경 시마다 그래프로 확인하면서 approximation을 할 수 있게 해 준다.

 


이전 포스팅에서 text() 함수를 이용하여 원하는 좌표에 텍스트를 넣는 방법을 알아 봤습니다.

 

 
2011/04/09 - [MATLAB] - MATLAB 그래프에 값 넣기


오늘의 포스팅에서는 그래프의 좌표를 마우스로 클릭하면 값이 입력되는 gtext() 함수에 대해 알아 보겠습니다.

 

먼저 다음 명령어를 통해 그래프를 하나 띄워 보죠.

 

x=1:10;

plot(x,x,'r:.'), grid on

 

이제 다음 명령어를 통해 input 1 이라는 글자를 그래프에 넣어 보겠습니다.

 

gtext('input 1')

 

위 명령어를 실행하고 그래프 위에 커서를 올리면 다음과 같이 십자선이 나타납니다.

 

 

원하는 위치에 클릭을 하면 아래 그림 처럼 글자가 입력이 됩니다.

 

 





다음으로 여러 글자를 한 지점에 입력해 보죠.

 

여러 글자를 입력할때는 다음과 같이 cell class 로 값을 써 줍니다.

 

gtext({'input 1', 'input 2', 'input 3'})

 

중간에는 ,(쉼표) 를 이용하였습니다.

 

위 코드를 실행하면 다음과 같이 한 지점에 위 글자들이 3개 행으로 입력됩니다.

 


 




이제 마지막으로 클릭을 할 때마다 문자열 하나씩 넣어보겠습니다.

 

gtext({'input 1' ; 'input 2' ; 'input 3'})

 

클릭을 할 때마다 문자열 하나씩 넣을 때는 위 코드처럼 ;(세미콜론) 을 넣어줍니다.

 

그럼 아래 그래프처럼 클릭할 때 마다 문자열이 입력이 됩니다.

 


MATLAB 이 굉장히 많은 장점 중 첫 번째가 그래프 기능이라고 생각된다. C/C++ 와 같은 언어를 이용해 계산을 하더라도 그 결과에 대해 그래프 출력을 하려면 참~ 어려움이 많다. MATLAB 은 단 몇 줄로 그래프 표현이 가능하다. 이번 포스팅에서는 이렇게 생성된 그래프에 값을 입력하는 방법에 대해 설명하려 한다.

일단 간단한 그래프를 하나 그려보자.

 

x=1:10

x =

1 2 3 4 5 6 7 8 9 10

 

y=1:10

y =

1 2 3 4 5 6 7 8 9 10

 

figure, plot(x,y,'r:.'), grid on

 

위 그래프의 x=3, y=3 지점에 'x=3, y=3' 이라고 글자를 넣어 보자. 그래프에 글자를 넣는 함수는 text() 라는 함수가 있다.

 

text(x,y,'string') 과 같은 형태로 사용하며 직관적으로도 알 수 있겠지만, x,y 라는 좌표에 string 이라는 값을 넣는다는 것이다.

 

'string' 부분에는 숫자를 넣을 수 없으므로 숫자를 문자로 바꿔서 표현해 줘야 한다. 숫자를 문자로 바꾸는 함수는 num2str() 이라는 함수가 있다.

 

아래 코드 처럼 문자를 표현해 보자.

 

S=['x=' num2str(3) ', y=' num2str(3) ]

S =

x=3, y=3

 

S 는 다음과 같이 문자라는 것을 알 수 있다.

class(S)

ans =

char

 

이제 3, 3 지점에 위의 S 문자를 넣어 보자.

 

text(3, 3, S)

 

근데 그림을 보면 문자가 그래프의 선에 너무 붙어 있어서 겹치는 것 처럼 보인다. 따라서 오른쪽으로 좀만 띄워서 글자를 넣는다.

 

text(3.5, 3, S)

 

위 그림 처럼 보기 좋게 문자가 입력되는 것을 확인 할 수 있다.


오늘 포스팅에서는 symbolic math 를 통해 계산한 수식에 대해 함수를 만드는 방법에 대해 설명 드리겠습니다.

 

일단 다음과 같이 수식을 정의 해 보죠.

 

syms a b x

 

f=a*x^2+x + 8

 

f =

a*x^2 + x + 8

 

위 수식에서 a 값을 2*b 값으로 치환을 해보겠습니다. 치환 할 때는 subs() 함수를 이용합니다.

 

f1=subs(f, a, 2*b)

 

f1 =

2*b*x^2 + x + 8

 



그럼 이제 위 f1 식을 함수로 정의해 보겠습니다. symbolic 식을 함수로 표현 할 때는 matlabFunction() 이라는 함수를 사용합니다.

 

hf1 = matlabFunction(f1)

 

hf1 =

@(b,x)x+b.*x.^2.*2.0+8.0

 

 

위와 같이 matlabFunction() 함수를 사용하면 기본적으로 function handle로 결과를 반환 합니다. 입력이 b, x 인 function handle hf1 을 반환하는 것을 확인 할 수 있죠.




function 파일을 만들고 싶을 때는 command 창에 다음과 같이 명령어를 입력합니다.

 

matlabFunction(f1,'file','function_file1.m');

 

위의 결과로 function_file1.m 이라는 함수가 만들어 지고 다음과 같이 파일로 저장됩니다. 




위 결과를 보면 함수의 입력이 b, x 의 순서인 것을 확인 할 수 있습니다. 다음 명령어를 통해 입력의 순서를 x,b 로 설정해 보겠습니다.
 

matlabFunction(f1,'file','function_file1.m','vars',[x b]);

 

위 명령의 실행 결과 아래와 같이 x, b 의 순서로 설정되었습니다. 




이제 함수의 출력 변수 명을 변경해 보죠. 위 식에서 f1 이었던 출력 변수명을 out_f 라는 변수명으로 바꿔보죠.

 

matlabFunction(f1,'file','function_file1.m','vars',[x b],'outputs',{'out_f'} );

 

  
출력 변수 명을 설정 할 때는 위 명령어에서 중괄호{} 를 이용하였습니다. 즉 cell class 로 설정해 주셔야 합니다.

 

위 명령어의 결과로 다음과 같은 함수가 만들어 집니다. 




이전 포스팅에서 Symbolic math toolbox 에 대해 간단하게 설명 드린 적이 있습니다.



2011/04/04 - [MATLAB] - MATLAB 수학이 쉬워지는 symbolic math toolbox


오늘은 symbolic math toolbox 를 이용한 latex code 변환과 MathType 이라는 수식입력 프로그램을 이용한 워드프로세서에서의 수식입력에 대해 설명 드리겠습니다.
 

  간단하게 다음과 같은 등차수열의 합을 symbolic math 를 이용하여 계산하고 그 결과를 MathType 을 이용하여 워드에 입력해 보죠.

 

 

  • 아래 코드는 symbolic math 를 이용하여 위 수식에 대해 계산한 것입니다.

 

 

  • latex() 함수를 통해 결과를 latex code 로 표현해 줬습니다.

 

  • 위 결과에서 latex 변환한 부분을 드래그 하고 복사 합니다.

 

  • MathType 프로그램을 열고 붙여 넣기 하면 다음 그림과 같이 됩니다.

 

 

  • MathType 프로그램은 latex code 에 대한 지원을 하기 때문에 위 그림처럼 예쁘게 수식이 나타납니다.

 

  • MathType 의 수식을 워드에 붙여 넣기 하면 아래 식 처럼 등차수열의 합에 대한 수식이 워드에 입력되게 됩니다.

 

  


  1. Cooltime 2011.04.08 00:52 신고

    -0-; 제가 이쪽 분야가 아니라서,,. 뭐라고 적혀 있는지 모르겠네요 ^^;

Random Variable을 생성하기 위해서는 r.v. 의 CDF 값을 알고 있어야 한다.

 

CDF 값을 알고 있으면, 대부분의 컴퓨터 언어에서 기본적으로 제공하는 uniform r.v. 을 생성한 후 CDF 의 inverse 를 통해 r.v. 을 생성한다.

 

오늘의 포스팅에서는 MATLAB 을 이용하여 Bernoulli r.v. 를 생성해 보고 그 PMF(Probability Mass Function)와 CDF 를 확인한다.

 

bernoulli r.v. 은 k=0, 1 에 대하여 다음과 같은 PMF 및 CDF 값을 갖는다.

 

PMF:

 

CDF:

 

그럼 이제 MATLAB을 이용하여 Bernoulli r.v. generation 을 생성해 보자.

 

코드는 다음과 같다.

 

 

 

 

위 코드는 p = 0.3 인 경우의 Bernoulli r.v. 를 생성하고 이에 대한 pmf, cdf 를 표현했으며

 

시뮬레이션에 따른 평균과 분산은 다음과 같다.

 

 

bernoulli r.v. 의 이론적인 평균은 p 이며 위 시뮬레이션의 경우 p=0.3

 

이론적 분산은 p(1-p)=0.3 x 0.7=0.21

 

이므로 시뮬레이션 결과와 이론적 평균 분산 값이 일치 함을 확인 할 수 있다.


  1. ㅠㅜ 2016.12.04 17:49

    bernoulli cdf를 전체 실수 정의역에서 plot할 수는 없나요? 올려주신 코드는 0, 1에서의 값만 알아볼 수 있는데 x에 -1을 입력하면 0, 5를 입력하면 1이 되는 코드를 짜려면 어떻게 해야 하는지 궁금합니다. if문으로는 단일 입력에 대한 값만 볼 수 있고 plot 등 벡터에 대한 값은 볼 수 없던데..

+ Recent posts