달력

07

« 2017/07 »

  •  
  •  
  •  
  •  
  •  
  •  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  •  
  •  
  •  
  •  
  •  

'전체'에 해당되는 글 138

  1. 2009.07.16 Kunth-Morris-Pratt(KMP) Algorithm Visualizer (2)
  2. 2009.07.01 제약의 철학 (2)
  3. 2009.07.01 Profiler
  4. 2009.07.01 inline함수, 무명함수, 함수포인터
  5. 2009.07.01 matlab 구조체
  6. 2009.07.01 셀배열
  7. 2009.05.17 리셋 (2)
  8. 2009.04.24 통계의 미학(Statistical Thinking)
  9. 2009.04.24 set_union
  10. 2009.04.22 손주은 (1)


Well I thought it would be nice to learn Flex so that I can visualize things better. I decided to visualize KMP string search algorithm. Click on first and second default buttons, then click start. Enjoy ! Oh, there is source code down there. Click on the link with text "KMPVisualizer.rar". Thanks !

KMP알고리즘의 동작 순서를 간단하게 그려봤습니다. Flex를 한번 해보고 싶었는데, 목표가 분명하지 않으면 랭기지를 배우는데 아무런 의미가 없겠죠? 그래서 간단히 Effect를 이용해서 KMP알고리즘 동작 원리를 시각화해 봤습니다. KMP는 Fail Function이라는 것을 정의해서 기나긴 텍스트 안에서 pattern을 찾아주는 것입니다.

처음에 뜨는 창에서 둘다 default로 놓고 start버튼을 누른 후 Start Animation을 클릭하세요. 잠시 멈춤도 가능하고 리버스(뒤로가기)도 가능합니다만, reverse로 할 경우에는 텍스트 색깔이 의도대로 나오지 않을 수 있으니 참고하세요.

이제 flex질은 그만하고 하던 기계학습 공부를 마무리하고 출국준비를 서둘러야겠습니다.ㅎㅎ. 소스코드도 첨부했으니 혹시라도 내부가 궁금하시다면 아래의 링크로 다운받으세요.

저작자 표시
신고
Posted by Kwang-sung Jun
2009.07.01 10:33

제약의 철학 개념2009.07.01 10:33


나는 도서관에 가야 공부가 잘 되는 타입이다. 한정된 장소에 칸막이로 한정된 나의 공간. 그리고 공부하지 않고 딴짓을 하고 있기엔 부끄러운 느낌이 드는 곳. 문자보내기 눈치보이고 전화받으려면 굳이 밖으로 나가서 받아야만 하는 수많은 제약을 가진 곳이다. 일정한 제약은 본인이 집중하고 싶은 것에 집중하게 해준다.

배수의 진이라는 말을 들어 보았는가? 심지어 도망갈 곳 조차 없도록 강을 뒤로 하여 전투를 벌이는 것이다. 이러한 제약이 주어진 상황이라면 죽을 힘을 다해 싸우지 않을 수가 없을 것이다.

<절차의 힘>이라는 책에는 독창성을 위해서는 소재를 한정시키는 것이 하나의 방법이라고 하면서 한 가지 예를 보여준다. 미술 작품으로 기억하는데, 같은 집을 표현하더라도 소재를 나무 젓가락으로 한정시켜 이것으로만 집을 지어 보이는 것이다. 작품을 본다면 오히려 소재를 한정시킴으로써 독특한 느낌을 주는 것을 알 수 있다.

CS전공자로서 프로그래밍에서도 이와같은 제약이 큰 힘을 발휘하게 한다. C로 치면, 적절한 type에 대한 제약으로 인해 우리가 실수하였거나 에러가 날 우려가 있는 부분에서 적절히 경고 메세지를 뿌려줄 수 있게 하는 것이다. 제약이 오히려 안전성을 보장해 주는 것이다.

주변 환경이 내 뜻에 맞지 않는다면, 스스로에게 적절한 제약을 주어 보는 것은 어떨까?

저작자 표시
신고
Posted by Kwang-sung Jun
2009.07.01 05:32

Profiler 삽질예방/Matlab2009.07.01 05:32

프로파일링
profile on

for i=1:100
    out = myfunc(in);
end

profile viewer

함수 호출 횟수와 수행 시간 등을 보여준다.
테스팅에 편리할듯..
저작자 표시
신고
Posted by Kwang-sung Jun

inline 함수( 단점: 수식 안에 파라미터가 아닌 변수 값을 넣을 수 없다)
그리고 feval의 사용법.

>> il_humps = inline('1./((x-.3).^2+.01) + 1./((x-.9).^ + .04) - 6','x');
>> il_humps
il_humps =
     Inline function:
     il_humps(x) = 1./((x-.3).^2+.01) + 1./((x-.9).^ + .04) - 6

>> il_humps(1)
ans =
   -2.9035

>> y = feval('sin', pi*(0:4)/4)
y =
         0    0.7071    1.0000    0.7071    0.0000

다음은 무명함수와 함수포인터를 사용하는 예제이다.

function tmpfunc()
    clc;
   
    a = 3;
 
    % impossible
    % myfunci = inline('sin(x)+a', 'x');
   
    % 무명함수를 정의하고 그것의 포인터를 넘긴다.
    myfunc = @(x) sin(x)+a;
   
    myfunc3 = @(x, y) x+y; % 인자가 두개인 경우의 예제
    myfunc3(3, 4)
   
    myeval_pointer = @myeval;  %% function pointer.
   
    a=0; % this won't change the function of 'myfunc'
   
    % 아래 함수 세개의 결과는 같다
    fprintf('myeval=%f\n', myeval(myfunc, 3));
    fprintf('feval=%f\n', feval(myfunc, 3));
    fprintf('myeval_pointer=%f\n', myeval_pointer(myfunc, 3));
   
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % 함수 포인터를 이용하여 이것을 배열에 넣고 사용하기! 매우 편리하겠지???

    myfunc2 = @(x) sin(x)+a; % now a is 0
    funary = {myfunc, myfunc2};
    funary{1}(3)
    funary{2}(3)
end

function ret = myeval(func, x)
    ret = func(x);
end


저작자 표시
신고
Posted by Kwang-sung Jun
2009.07.01 05:17

matlab 구조체 삽질예방/Matlab2009.07.01 05:17

구조체는 다음과 같이 쓴다. 원소를 더 추가하고 싶으면
circle(2).어쩌구.. 라고 쓰면 새로이 멤버가 추가된다.
>> circle.radius = 3.4;
>> circle.color='green';
>> circle.linestyle=':';
>> circle.center = [2.3 -1.2];
>> circle

circle =

1x1 struct array with fields:
    radius
    center
    color
    linestyle


다음과 같이 일괄적으로 구조체를 생성하는 방법도 있다.
>> values1 = {2.5 'sqrt(2)' 25.4};
>> values2 = {[0 1] [2.3 -1.2] [-1 0]};
>> values3 = {'--' ':' '-.'};
>> values4 = {'red', 'green', 'blue'};
>> values5 = {'yes', 'no', 'yes'};

circle = struct('radius', values1, 'center', values2, ...
'linestyle', values3, 'color', values4, 'filled',values5);


현재 circle구조체는 멤버가 셋이며 이 경우 다음과 같은 표현을 쓸 수 있다. 스트링을 이용하여 구조체의 멤버 접근을 일반적으로 할 수 있다는 것은 언젠가 편하게 쓰일 것 같다.

>> fldstr = 'color';
>> circle.(fldstr)

ans =
red

ans =
green

ans =
blue

fieldnames(circle) % 모든 필드 이름의 리스트를 리턴한다.


저작자 표시
신고
Posted by Kwang-sung Jun
2009.07.01 05:12

셀배열 삽질예방/Matlab2009.07.01 05:12

문자열은 배열 그대로 쓰면 공백들이 들어가서 불편하고, 다음과 같이 셀 배열을 이용한다.

>> strary(1) = {'abc'};
>> strary(2) = {'안녕친구들'};
>> strary
strary =
    'abc'    '안녕친구들'

>> strary(1)
ans =
    'abc'

>> strary{1}
ans =
abc

다음은 2행 3열의 셀 배열을 생성해 준다.

c = cell(2,3);


대부분 값의 대입과 값의 이용시에는
c{1,1} 와 같이 접근하면 된다.
그냥 c(1,1)이라고 하면 데이터 타입이 뭔지만 알려주는 역할을 하게 되고 값은 알려주지 않는다.

p.s.
"경우에 민감한(case-sensitive) 필드를 ...라 한다."....... 번역..... 진짜 한심한 수준의 번역이다..
저작자 표시
신고
Posted by Kwang-sung Jun
2009.05.17 20:32

리셋 개념2009.05.17 20:32

리셋 이라는 개념은 우리의 일상생활에서 정말 중요한 개념이다.
리셋 수행시 돌아가는 지점은, 우리가 못해도 요정도까지는 장담해 줄 수 있다 라고 인식해도 되는 부분이다.

특히 어떤 '도구'나 '기계'의 형태에서 reset은 필수가 아닌가 싶다.
컴퓨터의 경우를 보자. 제아무리 컴퓨터가 꼬이고 난리가 나도 reset버튼이면, 현재작업은 멈출지 몰라도 적어도 컴퓨터를 사용할 수는 있게 해준다.

엠피쓰리의 경우도 마찬가지이다. 볼펜 끝을 이용하여 찔러눌러 이용할 수 있게 되어있는데, 작동이 멈췄을 경우 최후의 보루로 사용할 수 있는 리셋이다. 컴퓨터에 복구 시점을 설정하는 것도 마찬가지...

그것 뿐이 아니다. 내가 문제를 제기하고 싶은 부분은 여기다. 웹에서 사용하는 텍스트 에디터의 경우 궁극적으로 html로 변환시키면서 서식을 적용시키는 방식인데, reset기능이 없다. 티스토리 에디터도 마찬가지이다. 이런저런 서식을 자꾸만 적용시키다 보면 이것저것 꼬여버려서 결국 서식을 제거하기위해 메모장으로 옮겼다가 다시 텍스트만 떠오는 일을 반복해야할 때가 있다.

지메일에서는 '포멧제거'라는 기능이 있어서 텍스트 서식을 '리셋'시킬 수 있다. How useful it is!

엔지니어라면 당신이 만드는 것에는 항상 '리셋' 기능이 있어야 한다는 점을 명심하자.
저작자 표시
신고
Posted by Kwang-sung Jun
2009.04.24 03:23

통계의 미학(Statistical Thinking) 독서2009.04.24 03:23

1부 - 데이터 수집의 중요성
 : 수집하려는 데이터가 대표성이 있는가?
2부 - 다양성의 통찰
 : "심슨의 패러독스", 하나의 기준으로만 나누면 이상한 결과가 보인다.
3부 - 비교 그리고 관계
 : 대조군이 제대로 설정되었는가? 통계로 인과관계 파악하기
4부 - 예측과  판단
 : 확률 높이기

사실 책을 구매하게 된 것은 4부에 나와있는 확률 문제 때문이었다. 이 책은 통계에 대해서 흔히 일반인들이 착각하거나 속기 쉬운 부분을 알기쉽게 설명하고 있다. 그러나 그 이상도 그 이하도 아니었다는 점이 조금 아쉽다. 책을 구매할 때 앞에 목차를 주로 참고하는 편인데, 소제목들은 매우 매력적이지만, 본문은 기대에 부흥하지 못하는 부분이 많았다.

어쨌거나, 1부에서는 데이터 자체가 대표성이 없는 경우 생기는 오류를, 2부에서는 다양한 측면을 지닌 통계자료를 한가지 기준으로 나눌 때 나타날 수 있는 왜곡현상을 설명한다. 3부에서는 인과관계 파악에 핵심을 두고 있으며, 4부에서는 지금까지 배운 분석으로 조금 더 '확률 높은 선택'을 하는 법에 대해 배운다.

내 생각에 핵심은 바로 4부가 아닐까 하는데, 흥미로운 문제가 있어서 여기에 소개하려고 한다. 이른바 <몬티 홀 문제>(위키바로가기)  라고 하는 것이다.
퀴즈쇼에 출연한 당신, 1/3의 확률로 자동차를 상품으로 탈 수 있다!! 그림처럼 양 둘, 차 하나 있는데, 모두 커텐으로 가려져 있어 어디에 무엇이 있는지 모르다. 당신은 이 중 하나의 커탠을 선택하여 열어볼 수 있으며, 기회는 단 한번 뿐이다. 당신은 물론 자동차가 그려진 곳의 커텐을 열고 싶을 것이다.

당신이 처음에 3번째 칸을 지목했다고 하자. 그러자 사회자는 기회를 한번 더 주겠다며 당신이 지목한 세번째 칸을 제외한 두 칸중 양이 들어있는 커텐을 하나 열어준다. 그러면 이제 당신은 두 가지 선택권이있다. 당신은 처음에 지목했던 칸을 열 것인가? 아니면 다른 하나의 칸을 지목하여 열 것인가? 어느쪽이 더 확률 높은 게임이 될 것인지 한번 생각해보자.

대부분의 사람들은 선택을 바꾸었다가 후회할 것 같기에, 바꾸지 않고 고수한다고 한다. 정답은 위키피디아에서 "몬티홀문제"를 검색해 보길 바란다. 나는 개인적으로 매우 충격적인 결과였다고 생각한다!
저작자 표시
신고
Posted by Kwang-sung Jun
2009.04.24 02:37

set_union 삽질예방/STL 교과서2009.04.24 02:37

STL에 set을 가만 보면
우리가 원하는 연산이 없습니다.

합집합, 교집합, 차집합 연산이 바로 그것이죠
그런데 사실 그러한 연산들은 STL내에 알고리즘 형태로 어떤 컨테이너(예.벡터)에서도
사용할 수 있도록 제네릭하게 제공되고 있습니다.

set<string> a;
set<string> b;
set<string> c;

a.insert("abc");
a.insert("def");
b.insert("abc");
b.insert("123");

set_union(s.begin(), s.end(), b.begin(), b.end(), inserter(c, c.begin()));

for(set<string>::iterator it = c.begin(); it != c.end(); it++)
{
   cout << *it << endl;
}


결과는

123
abc
def


입니다.

set_union검색하시면, 차집합과 교집합을 어떻게 하는지도 나와있습니다.
일반화된 함수라 사용법이 조금 까다롭기에 혹시 도움이 될까 올립니다.

저작자 표시
신고
Posted by Kwang-sung Jun
2009.04.22 15:47

손주은 개념2009.04.22 15:47

출처:
http://news.cyworld.com/view/20090422n00149?mid=n0410

나는 인생의 목표가 행복이라는 것은 근거 없다고 생각해요. 인생의 시작과 끝이 자기 의지로 되지 않는데, 행복이란 인간이 너무나 행복하지 않아 만들어 낸 형이상학적 추론에 불과하다고 생각하죠. 즉 ‘행복을 위해 산다’는 말은 본질적으로 성립하지 않는 말이에요. 저는 대신 ‘몰입의 평화와 성취감이 나를 존재하게 한다’고 믿어요.


더보기



저작자 표시
신고
Posted by Kwang-sung Jun


티스토리 툴바