1

我正在尝试使用 lapacke 的 dgels 功能:当我将它与 malloc 功能一起使用时。它没有给出正确的值。当我使用 malloc 并创建矩阵时,谁能告诉我有什么错误?谢谢你

 /* Calling DGELS using row-major order */

#include <stdio.h>
#include <lapacke.h>
#include <conio.h>
#include <malloc.h>

int main ()
{
double a[3][2] = {{1,0},{1,1},{1,2}};

double **outputArray;
int designs=3;
int i,j,d,i_mal;
lapack_int info,m,n,lda,ldb,nrhs;
double outputArray[3][1] = {{6},{0},{0}};*/



outputArray = (double**) malloc(3* sizeof(double*)); 
for(i_mal=0;i_mal<3;i_mal++)
{
outputArray[i_mal] = (double*) malloc(1* sizeof(double));  
}
for (i=0;i<designs;i++)
{
printf("put first value");
scanf("%lf",&outputArray[i][0]);
}

m = 3;
n = 2;
nrhs = 1;
lda = 2;
ldb = 1;




info = LAPACKE_dgels(LAPACK_ROW_MAJOR,'N',m,n,nrhs,*a,lda,*outputArray,ldb);

for(i=0;i<m;i++)
{
for(j=0;j<nrhs;j++)
{
printf("%lf ",outputArray[i][j]);
}
printf("\n");
}
getch();

返回(信息);}

4

1 回答 1

0

问题可能来自outputArray内存不连续。你可以改用这样的东西:

 outputArray = (double**) malloc(3* sizeof(double*)); 
 outputArray[0]=(double*) malloc(3* sizeof(double));
 for (i=0;i<designs;i++){
     outputArray[i]=&outputArray[0][i];
 }

不要忘记释放内存!

 free(outputArray[0]);
 free(outputArray);

编辑:连续意味着您必须一次为所有值分配内存。请参阅http://www.fftw.org/doc/Dynamic-Arrays-in-C_002dThe-Wrong-Way.html#Dynamic-Arrays-in-C_002dThe-Wrong-Way:某些软件包,如 fftw 或 lapack 需要此功能优化。当您调用 malloc 三次时,您创建了三个部分并且出现了问题。

如果您只有一个右手边,则不需要二维数组 ( double**)。outputArray[i]是 a double*,即第 i 行(row major)的开始。outputArray[i]=&outputArray[0][i*nrhs];如果您有许多 RHS,则可能是正确的线。

通过在您的代码中执行此操作,您将构建一个 3 行、一列,即一个 RHS。解决方案是大小n=2。应该是outputArray[0][0] , outputArray[1][0]。我希望我没有错,在简单的情况下检查一下!

再见,

于 2014-04-17T21:20:48.770 回答