본문 바로가기

Library

STL 할당자를 직접 구현한다? STL 할당자는 애초에 다양한 플랫폼에서의 메모리 관리 방식 차이로 인한 비호환성을 제거하려는 추상층으로 등장했지만, 성능상의 문제 때문에 제대로 사용되는 경우가 없었다. STL 할당자는 대단히 매력적인 아이디어였지만, 이와 같은 고전적인 이유 때문에 실제로 컨테이너를 구현하는데 사용된 적은 별로 없었다. 더구나, 현 시점에서는 다음과 같은 새로운 요소들 때문에 STL 할당자를 직접 작성하려는 것은 회의적으로 생각된다. 첫째, STL 할당자는 STL 자체에서의 효율성 저하 문제 때문에, 모든 STL 구현이 할당자를 사용하는 것은 아니다. 즉, 애써 STL 할당자를 만들어도, 모든 플랫폼에서 동작한다거나, 기대한만큼 성능을 내주리라 보장할 수 없다. 둘째, C++0x에서의 rvalue reference 도.. 더보기
C++ Memory Pools and Angra 윈도우 7의 LFH(Low Fragmented Heap)의 성능은 매우 좋은 편에 속한다. 개발 플랫폼을 윈도우 7으로 한정한다면, 기본 메모리 할당기만 써도 성능에 손해보는 일은 없을 것이다. 그러나, 플랫폼에서 LFH와 같은 쓸만한 힙 매니저를 제공하지 않는다면, 효과적으로 메모리를 관리하기 위해 잘 구현된 메모리 할당기가 필요하다. 대표적으로, boost, ACE, Loki는 간단하게 쓸 수 있는 메모리풀을 제공한다. 먼저, boost::singleton_pool은 부스트 풀 라이브러리(boost pool library)에 기반한 싱글턴 타입의 메모리 할당기이다. SSS(Simple Segregated Storage)라는 메커니즘을 바탕으로, 대량의 순차 할당, 반환 및 무작위 할당, 반환과 같은 .. 더보기
신호의 페이저 합 만약, 주파수가 같고 위상만 다른 신호들이 있다면, 이들의 합은 놀랍게도 같은 주파수와 다른 위상 값만 가지는 하나의 코사인 함수로 표현할 수 있다. 즉, 다음과 같이 정리할 수 있다. 전통적인 삼각 함수의 공식을 사용하여 이것을 증명하면 다음과 같다. 먼저, 코사인의 합은 다음과 같이 전개할 수 있다. 이 정리를 사용하여 각 코사인 신호의 합을 전개하면 다음과 같다. 그리고 각 항의 공통 인자를 빼내어 묶으면, 우측의 식과 직접적으로 비교할 수 있게 된다. 그러나, 이와 같은 방법으로 코사인 신호의 합을 나타내는 것은 너무 복잡하다. 따라서, 좀 더 간단한 표현이 필요한데, 복소 지수 표현을 사용하면 좀 더 간단하게 이것을 증명할 수 있다. 즉, 어떤 정현파도 다음과 같이 나타낼 수 있다. 이것을 사용.. 더보기
역 오일러의 공식과 신호의 주파수 성분 복소 지수로 표현된 신호는, 삼각 함수에 관한 오일러의 공식을 사용하여 코사인, 사인에 대해 각각 정리할 수 있다. 이것은 신호 처리에 있어서 중요한데, 주파수가 인 코사인 신호는 사실 두 개의 복소 지수 신호로 이루어져 있기 때문이다. 이 사실을 파악하기 위해, 다음의 삼각 함수에 관한 오일러의 공식을 살펴보자. 삼각 함수에 관한 오일러의 공식을 사용하여 와 에 대해 정리하면 다음과 같다. 이것을 이용하여 를 다음과 같이 양과 음의 주파수를 가진 복소 지수로 표현할 수 있다. 즉, 위의 식을 정리하면, 주파수가 인 코사인 신호는 사실 두 개의 복소 지수 신호로 이루어져 있으며, 하나는 양의 주파수 를 가지고, 다른 하나는 음의 주파수 를 가진다. 양의 주파수를 가지는 복소 지수 함수의 진폭은 이고, 음.. 더보기
정현파의 복소 지수 표현 정현파(sinusoids)는 유용하기는 하지만, 이것을 직각 좌표계(cartesian coordinate)로 표현하는 것은 상당히 성가시다. 오일러의 공식을 사용하여 이것을 표기하면, 좀 더 쉽고 대수적으로 정현파를 다룰 수 있다. 또, 복소 지수 형태로 정현파를 표시하면 보다 쉽게 중요한 성분들을 구별해 낼 수 있다. 정현파는 다음과 같이 복소 지수 형태로 표시할 수 있는데, 이것은 오일러가 유도한 것이다. 자세한 것은 다음을 참고하라 : http://celdee.tistory.com/630 이로부터, 다음과 같은 식을 정의할 수 있다. 시간의 함수인 복소수를 그리려면 두 개의 그래프가 필요하다. 즉, 실수 부분과 허수 부분을 나타내는 두 개의 그래프가 필요하다. 그러나, 현실적으로는 실수 부분이 더 .. 더보기
정현파(Sinusoids) 자연계를 근사하는 많은 함수 중에서 가장 중요한 것은 단연 삼각 함수이다. 왜냐하면, 삼각 함수는 원함수와 관련되어 있고, 원함수는 주기성을 가지기 때문이다. 이차 곡선 중 쌍곡선(hyperbola)도 매우 흥미로운 함수인데, 이 곡선은 원뿔을 원뿔의 밑면과 옆면 사이의 각보다 큰 각의 평면으로 자를 때 얻을 수 있다(그래서, '~을 초과하는'을 뜻하는 'hyper'가 붙었다). 그러나, 쌍곡선은 주기성을 가지지 않기 때문에 상대적으로 그 중요도가 원함수에 미치지 못한다. 나중에 밝혀진 사실이지만, 쌍곡선은 허수 주기를 가진다. 신호 처리에서는 코사인(cosine) 함수와 사인(sine) 함수를 매우 중요하게 다루며, 이들 함수를 정현파(sinusoids)라 부른다. 정현파의 일반식은 다음과 같다. 신호.. 더보기
e : A Mysterious Number 는 수학사에서 와 함께 매우 중요한 수이다. 해석학의 중추를 담당하는 신비로운 수이기 때문이다. 현대 수학은 크게 기하학, 해석학, 대수학으로 분류할 수 있으며, 그 외에도 위상 수학이라는 새로운 분야가 활발하게 연구 중이다. 기하학은 다시 유클리드 기하학과 비유클리드 기하학으로 나뉘어지며, 해석학은 미적분이 중심이 되는 분야이다. 대수학은 수학 기호 체계의 형식성을 다룬다. 는 바로 미적분학의 발생부터 가장 중요한 역할을 담당한 수이다. 특히, 오일러는 와 함수 에서 허수를 취하도록 했는데, 이렇게 해서 얻은 함수의 놀라운 성질은 복소 함수론으로 이르는 길을 만들었다. 는 과연 어떤 수일까? 인류가 가장 먼저 다루기 시작한 수는 자연수이다. 이 때에는 수를 다루는데 0이란 개념이 존재하지도 않았고, 단.. 더보기
Fields 인테그랄 도메인(integral domain)은 zero divisors를 가지지 않기 때문에, 0이 아닌 요소들의 집합은 곱셈에 대해 닫혀있다. 그러므로, 곱셈은 이 0이 아닌 집합에서의 연산이며, 자연스럽게 이것이 군(group)인지 의문이 생기게 된다. 곱셈은 링(ring)에서 결합 법칙이 성립해야 하고, 여기서 정의하고자 하는 연산은 결합 법칙이 성립해야 한다. 또, 인테그랄 도메인은 항등원을 가지기 때문에 이 연산은 항등원을 가져야 한다. 따라서, 곱셈에 대해서, 0이 아닌 원소를 집합으로 하는 인테그랄 도메인은 역원의 부재 때문에 군이 될 수 없다. 인테그랄 도메인에서, 예를 들어, 0이 아닌 원소들은 단지 1과 -1만 역원을 가지기 때문에, 곱셈에 대해서 군을 형성하지 못한다. 그러나, 유리.. 더보기
정점 혼합(Vertex Blending, a.k.a. Skinning) 3D로 모델링된 사람의 팔을 실제로 움직인다고 하자. 뼈는 강체(rigid)와 동일하게 생각할 수 있으므로, 뼈를 구성하는 폴리곤들은 단일한 변환 행렬에 의해 변환될 수 있다. 그러나, 팔에 피부를 구성하는 페이스들이 입혀져 있을 때, 이것을 뼈와 동일하게 변환한다면 변환 중 피부가 연결되지 않고 찢어지게 된다. 사람의 피부는 실제로 탄력성을 가지고 있기 때문에, 관절의 회전에 따라 피부의 늘어나는 비율이 그만큼 다르기 때문이다. 즉, 인체의 팔을 구성하는 피부의 경우, 3D로 표현할 때 하나의 변환 행렬로 표현할 수 없다. 정점 혼합(vertex blending)은 이 문제에 대한 해결 방법이다. 정점 혼합은 스키닝(skinning)과 같은 이름으로도 알려져 있는데, 정점에 적용되는 변환 행렬에 대해 .. 더보기
Transpose Matrix 전치 행렬(transpose matrix)의 정의는 다음과 같다. def. 가 임의의 행렬일 때 의 전치 행렬을 로 쓰고, 의 행과 열을 바꿔서 얻은 행렬로 정의한다. 전치 행렬은 다음과 같은 성질을 가진다. 만약, 전치 행렬이 역행렬을 가지고, 도 역행렬을 가진다면 다음이 성립한다. theorem. 더보기