Powershell 을 사용하여 빌드 스크립트를 만들다 보니 쌍을 이루는 구조체를 만들어야 하는 경우가 종종 있었습니다. 그래서 Powershell struct 를 찾아보다가 Python 에서 사용하는것 처럼 tuple 을 사용 하는게 편하겠다는 생각이 들어서 검색을 해 봤습니다.

Powershell 에서 역시 Python 과 마찬가지로 tuple 타입을 사용할 수 있었고 아래 포스팅에서 그 사용법을 알 수가 있었습니다.

https://devblogs.microsoft.com/scripting/using-a-tuple-in-powershell/

간단하게 정리하면 아래와 같이 [System.Tuple] 이라고 써주고 정의하면 되는 것이었습니다.

[System.Tuple]::Create("Flintstone", "Rubble", "Dino")

Powershell 에서 대괄호[] 를 사용하는 경우는 .NET Framework class를 사용하는 것입니다. 즉 Powershell 에서 System.Tuple .NET Framework class 를 사용하여 tuple 타입을 사용할 수 있는 것입니다.



MATLAB 을 사용하다 보면 struct 타입을 종종 사용하곤 합니다. 그리고 struct 타입을 모아서 배열로도 사용하곤 하는데 MATLAB 기본 함수중에 struct 타입 배열을 정렬하는 기능의 함수는 없는것 같더군요.

그냥 만들어 사용해도 되겠지만 검색을 조금 해보니 비슷한 코드를 발견했고 해당 코드를 정리해서 아래와 같은 함수로 만들었습니다.




이제 함수를 만들었으니 한번 사용해 보죠.

a = struct('id',1, 'data', [1:10])

b = struct('id',2, 'data', [2:11])

beforeVec= [b a]; % 두 struct 를 사용하여 배열로 만듬

sortedVec = struct_sort_by_field(beforeVec,1,1); % 첫번째 field 의 첫번째 인덱스 값에 대해 정렬

beforeVec.id % 기존 배열의 인덱스 확인

sortedVec.id % 정렬된 배열의 인덱스 확인

위 결과를 보면~ sortedVec 는 id 값에 따라 오름차순으로 정렬 된 것을 확인 할 수 있습니다.



아래 포스팅에서 MATLAB containers.Map 에 대해 소개했었는데요.



2012/06/10 - [programming language/MATLAB] - MATLAB MAP data structure


 

검색을 하다 보니 또 다른 방식으로 hash table을 구성 할 수 있더군요.

 

Hash table 은 key => Value 의 쌍으로 구성된 데이터 타입인데~

 

아래 포스팅에서는 hash table 을 MATLAB struct 와 java 를 이용하는 방식으로 소개 합니다.

 

http://smlv.cc.gatech.edu/2010/03/10/hash-tables-in-matlab/

 

첫번째로 struct 를 사용하는 방식의 예제 코드는 다음과 같습니다.

 

terms = { 'price' 'cents' 'govern' 'billion' 'company' 'state' 'economy' 'stock' };

ids = num2cell(1:length(terms));

dict = reshape({terms{:};ids{:}},2,[]);

dict = struct(dict{:});

dict.('cents') % my two cents!

 

위 예제에서 dict 라는 변수는 struct 라는 것을 확인 할 수 있고~ 다음과 같이 struct 의 field 와 값의 형태로 구성됩니다.

 

 

위에서 struct 를 사용하는 방식은 hash table 의 크기가 작을때는 유용하게 사용할 수 있을 것 같은데… 그 크기가 커지면 그렇게 좋은 방식은 아닌 것 같군요.

 

다음으로 java 를 사용하는 방식인데~ 에제 코드는 다음과 같습니다.

 

dict = java.util.Hashtable;

dict.put('key',[1 2 3]);

dict.get('key')

dict.containsKey('key')

 

dict.size 라고 하면 hash table dict 의 크기를 알 수 있고~ dict.keySet 라고 하면 어떤 key 값들이 정의되어 있는지 확인 할 수 있습니다.

 


파이썬은 굉장히 직관적이면서도 쉬운 문법과 잘 정리된 매뉴얼 등 장점이 참 많은 언어라는 생각이 듭니다. 요즘 여차 저차 해서 파이썬을 만지작 거리고 있는데~ 참 재미 있더군요.

 

조금만 알아도 굉장히 많은 것들을 할 수 있는 효율적인 언어구나 하는 생각이 딱~~ 들었습니다.

 

어쨌든 오늘은 Python 에서 wav 파일을 읽는 방법에 대해 설명 드리려 합니다.

 

뭐 아는 분들은 아시겠지만 간단하더군요.

 

http://stackoverflow.com/questions/2060628/how-to-read-wav-file-in-python

 

아래 코드는 위 주소를 참조하여 만들었습니다.

 

위 주소의 댓글들을 보니 audiolab 이라는 모듈도 있는 것 같고 Scipy를 이용해서도 읽어 들일수가 있는 것 같더군요.

 

저는 Python 기본 모듈인 wave 모듈을 이용했습니다.

 

아래 코드는 16 비트 wave 파일을 읽어드리는 코드 입니다.

 

Mono, stereo 까지만 읽어 들일 수 있게 했습니다.

 

 

위 예제 코드는 MM.wav 라는 파일을 읽어들이는 코드 입니다.

nRead 는 읽어 들일 프레임 수 이고~ 당연히 전체 데이터 프레임 수보다는 작아야 겠죠~

wave 파일이 stereo 라면 wave_channel1, wave_channel2 에 각 채널의 데이터가 들어가고~ mono 면 wave_channel1에만 데이터가 저장 됩니다.

 

16 비트가 아니라면 struct module 의 unpack() 의 format 을 변경 해 줘야 합니다. 위 예제 코드에서 'h' 는 2 byte integer 니깐~ 매뉴얼을 참조해서 적절한 Format 으로 변경이 되어야 합니다.


오늘의 포스팅에서는 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

 


+ Recent posts