2017-05-11 3 views
0

나는 복잡한 숫자를 사용하는 외부 라이브러리와 인터페이스하기 위해 cython을 사용하고 있습니다. 라이브러리 구성 방법에 따라 64 비트 또는 128 비트 복소수가 될 수 있습니다. 가변 크기의 int의 경우, 예를 들어, 내가 할 수있는 :Cython에서 가변 크기 typdef'd 복합 유형 액세스하기

cdef extern from "my_header.h": 
    ctypedef int HeaderIntType 

HeaderIntTypeint 또는 long이이 헤더 파일에 typedef되어 방식에 따라이 될 수있다. 내 CDEF의 통근자의 내부

ctypedef complex HeaderComplexType

을하려고 할 때, 나는 복잡한 외부 형식 정의가 지원되지 않는다는 오류가 발생합니다.

라이브러리를 구축 한 방식에 따라 복잡한 유형의 유연한 기능을 제공 할 수있는 좋은 방법이 있습니까?


는 업데이트 :

cdef extern from "my_header.h": 
    int c_function(ComplexType* c) 

def spam(np.ndarray[ComplexType,mode='c'] a not None): 
    c_function(&a[0]) 

c_function가 나는 경우를 처리 할 위치, my_header.h 입력 ComplexType의 인수로 정의된다

은 최소한의 형태로, 다음 목표는 내 ComplexType은 64 비트 또는 128 비트 콤플렉스로 typedef됩니다. 따라서 융합 된 유형이이 문제를 잘 처리 할 지 확신 할 수 없습니다. 어떤 팁? (단지 융합 된 타입을 사용하려고 시도 할 때, gcc는 내 헤더 파일에서 찾을 수 있기 때문에 함수 __pyx_fuse_0c_function__pyx_fuse_1c_function의 암시 적 선언에 대해 불평하고 분명히 존재하지 않는다.

답변

1

사이 썬은 바로이 목적을 위해 fused types 있습니다

ctypedef fused ComplexType: 
    np.complex64_t 
    np.complex128_t 

def foo(ComplexType[:,::1] A): 
    cdef np.ndarray[ComplexType,ndim=2] B 
    print(42) 

당신은 내 문제의 일부를 해결하는 것

a=rand(3,3) + rand(3,3)*1j 
foo(a) # complex128 case 
a=a.astype(np.complex64) 
foo(a) # complex64 case 
+0

처럼 파이썬에서 호출 할 수 있습니다. 나는 파이썬 코드가 내 cython 확장에 액세스하여 올바른 형식의 numpy 배열을 선언 할 수있게하고 싶습니다. 그런 다음 C에서 액세스합니다. 퓨즈 유형을 사용할 수 있는지 확실하지 않습니다. 그들은 어떻게 든 할 수 있니? –

+1

예, cython이 올바른 함수를 생성합니다. C와의 인터페이싱 방식에 따라 cython 수준에서 상당히 많은 작업을 수행 할 수 있습니다. – romeric

+0

업데이트보기 - 융합 된 유형이 나를 위해 갈 수 있는지 잘 모르겠다. –