我正在尝试使用LAPACK在C中实现卡尔曼滤波器,并且需要通过回归估计一些参数。我正在使用dgels但是当我尝试运行它时,它仍然会出现奇怪的段错误。我认为它可能与我在参数LWORK中设置的块大小有关,所以我尝试通过设置LWORK = -1来查询最佳大小。根据文档,WORK的第一个元素应该包含LWORK的最佳值。但是当我尝试访问WORK [0]时,我得到了另一个段错误,尽管在调用dgels之前已经分配了它!有什么线索给出了什么?这是代码,减去我分配double *A, *B
和int 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
答案 0 :(得分:0)
这里不遵循 FORTRAN API :数组作为对第一个元素的引用传递,但是你将它作为参考传递给第一个元素的引用(即你应该使用{ {1}}代替WORK
)。
另请阅读DGELS documentation以确保您正确理解其参数含义(例如&WORK
,NRHS
和LDA
)。
是的,请注意 C LDB
大小,事实 FORTRAN 使用列主要订单和 C 使用行主要订单(wikipedia article)。