0

我正在尝试使用 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 雪豹

编辑:原来英特尔有一个很好的例子来说明如何dgelsC中使用

4

1 回答 1

0

您在这里不遵循FORTRAN API:数组作为对第一个元素的引用传递,但您将它作为对第一个元素的引用的引用传递(即您应该使用WORK而不是&WORK)。

另请阅读DGELS 文档以确保您正确理解其参数含义(例如NRHSLDALDB)。

是的,请注意C int的大小以及FORTRAN使用列优先顺序C使用优先顺序的事实(维基百科文章)。

于 2013-01-25T13:10:33.927 回答