在LAPACK中查询dgels的最佳块大小

时间:2012-07-13 00:30:59

标签: c segmentation-fault lapack

我正在尝试使用LAPACK在C中实现卡尔曼滤波器,并且需要通过回归估计一些参数。我正在使用dgels但是当我尝试运行它时,它仍然会出现奇怪的段错误。我认为它可能与我在参数LWORK中设置的块大小有关,所以我尝试通过设置LWORK = -1来查询最佳大小。根据文档,WORK的第一个元素应该包含LWORK的最佳值。但是当我尝试访问WORK [0]时,我得到了另一个段错误,尽管在调用dgels之前已经分配了它!有什么线索给出了什么?这是代码,减去我分配double *A, *Bint p->N的位。

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,Mac OS X Snow Leopard

编辑:结果证明英特尔有一个很好的例子,说明如何在C here中使用dgels

1 个答案:

答案 0 :(得分:0)

这里不遵循 FORTRAN API :数组作为对第一个元素的引用传递,但是你将它作为参考传递给第一个元素的引用(即你应该使用{ {1}}代替WORK)。

另请阅读DGELS documentation以确保您正确理解其参数含义(例如&WORKNRHSLDA)。

是的,请注意 C LDB大小,事实 FORTRAN 使用列主要订单 C 使用行主要订单wikipedia article)。