2012-07-13 3 views
0

LAPACK을 사용하여 C에서 Kalman 필터를 구현하려고하는데 회귀 분석을 통해 일부 매개 변수를 추정해야합니다. dgels을 사용하고 있지만 실행하려고하면 이상한 segfault가 계속 발생합니다. LWORK 매개 변수에서 설정 한 블록 크기와 관련이있을 것으로 생각하여 LWORK = -1로 설정하여 최적의 크기를 쿼리했습니다. 문서에 따르면 WORK의 첫 번째 요소는 LWORK의 최적 값을 포함해야합니다. 하지만 WORK [0]에 액세스하려고하면 dgels를 호출하기 전에 할당 했음에도 불구하고 또 다른 segfault를 얻습니다! 무슨 단서가 있니? 여기에 코드가 있는데, double *A, *Bint p->N을 할당 한 비트를 뺀 것입니다.LAPACK의 dgels에 대한 최적의 블록 크기 쿼리

char T = 'T'; // Transpose A 
int n = 1000; 
int LWORK = -1; 
int INFO = 0; 
double * WORK = (double *) malloc (200*sizeof(double)); 
printf("%e\n",WORK[0]); // This works 
dgels_(&T, &(p->N), &n, &(p->N), A, &(p->N), B, &n, &WORK, &LWORK, &INFO); 
printf("%e\n",WORK[0]); // This segfaults 

GCC 4.2.1, 맥 OS X 스노우 레오파드 (Snow Leopard)

편집 : 인텔이 here

+1

코드를 게시 할 수 있습니까? –

+0

Fortran 바인딩에서 일반적인 오류로 잘못된 너비 int가 사용되었습니다. – Anycorn

+0

다른 너비 int를 어떻게 전달합니까? 서명 안돼? 대신 짧은 것을 시도해보십시오. –

답변

0

당신은 을 따르지 않는 C에서 dgels을 사용하는 방법의 좋은 예제가 밝혀 FORTRAN API 여기 : 배열은 첫 번째 요소에 대한 참조로 전달되지만 첫 번째 요소에 대한 참조로 참조로 전달됩니다 (예 : &WORK 대신 WORK 사용해야합니다).

또한 DGELS documentation을 올바르게 읽으면 인수의 의미를 올바르게 이해할 수 있습니다 (예 : NRHS, LDALDB).

그리고 네, Cint 크기와이 열 - 주요 순서C 사용을 사용하는 사실 FORTRAN에주의 행 - 우선 순서 (wikipedia article).