用malloc在lapacke的dgels功能(using malloc in dgels func

2019-10-19 22:54发布

我试图用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();

返回(信息); }

Answer 1:

该问题可能来自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]是一个double* ,即,第i行(行主要)的开始。 右线可以是outputArray[i]=&outputArray[0][i*nrhs]; 如果你有很多RHS。

通过在代码中这样做,你正在建设一个3行,一列,这是一个RHS。 该解决方案,是大小为n=2 。 它应该是outputArray[0][0] , outputArray[1][0] 。 我希望我不是太错了,看看这个简单的案例!

再见,



文章来源: using malloc in dgels function of lapacke