2010-07-26 2 views
2

저는 수학 라이브러리를 쓰고 있습니다. 핵심은 C++입니다. 나중에 그것은 순수 C로 구현 될 수 있습니다 (C99). 파이썬과 matlab 등을 사용하여 라이브러리를 사용할 수 있도록 C와 같은 API가 필요하다고 생각합니다. 내 인상은 C++로 이것을하는 것은 고통 스럽다.C (99)와 C++을 섞은 복소수 타입

따라서 double complex *some_array_in_C99complex<double> *some_array_in_cpp 사이에서 전송하는 데 적합한 표준 방법이나 적절한 방법이 있습니까?

나는 단지 void * 포인터를 사용할 수 있지만 그게 좋은지 확실하지 않습니다.

ctypes가 complex<double>과 함께 잘 작동하는 것처럼 보이기 때문에 nitpicking 일지 모르지만 matlab 및 기타 가능한 숫자 환경이 걱정됩니다.

+0

C99 복합체를 MATLAB과 함께 사용할 수 있습니까? – kennytm

+0

어, 좋은 지적이야. http://www.mathworks.com/access/helpdesk/help/techdoc/matlab_external/f21585.html 복합 이중 정밀도 행렬 MATLAB 가장 일반적인 데이터 유형에서 복소 배정도 nonsparse 행렬 . 이 행렬은 double 유형이며 차원이 mxn입니다. 여기서 m은 행 수이고 n은 열 수입니다. 데이터는 배정도 숫자의 두 벡터로 저장됩니다. 하나는 실제 데이터를 포함하고 다른 하나는 허수 데이터를 포함합니다. 이렇게 간단합니다. 나는 아무것도 걱정하지 않을지도 모른다. –

답변

2

C99 및 C++ 0x 표준은 모두 각각의 이중 복합 유형이 두 개의 복식 배열과 동일한 정렬 및 레이아웃을 가져야 함을 지정합니다. 즉, 인수를 void *으로 전달하고 루틴을 어느 언어에서든 쉽게 호출 할 수 있으며 많은 라이브러리에서 가져온 접근 방식입니다.

reinterpret_caststd::complex<double>*에서 double*으로 올바른 것을 보장하는 C++ 0x 표준 (§26.4). 내가 정확하게 기억한다면 이것은 이전 버전의 표준에서는 그렇게 명확하게 지정되지 않았습니다. C++ 0x를 대상으로한다면이 인터페이스를 사용하여 인터페이스에서 더 깨끗한 작업을 수행 할 수 있습니다.

실제 레이아웃과 정렬 사양이 일치하도록 정의되었으므로 언어의 헤더 파일에 형식을 조건부로 지정하고 싶습니다. 귀하의 구현은 어느 한 언어를 사용할 수 있으며 데이터는 어느 방향 으로든 메모리에 적절하게 배치됩니다. MATLAB이 내부적으로 어떤 일을하는지 잘 모르겠다. 그래서 이것이 MATLAB과 호환되는지 아닌지 모르겠다. 그들이 표준 LAPACK 방식을 사용한다면, 모든 상황에서 모든 플랫폼이 아닌 많은 플랫폼에있을 것입니다. LAPACK은 자신의 double complex 유형이 double 인 두 개의 double 구성원이있는 struct 유형으로 정의합니다. 보통은 동일한 방식으로 메모리에 배치됩니다 (이는 보장되지 않음). 그러나 일부 플랫폼에서는 다른 호출 규칙을 따를 수 있습니다.

+0

위대한, 당신의 reposonse 주셔서 감사합니다. -새긴 금 –