任何主体都知道如何将2d动态数组转换为静态数组,这样我就可以在lapacke中使用它。只取c中静态矩阵的dgels函数?当我使用malloc时,它不会给出正确的答案。我如何使用malloc使其与之协同工作。谢谢
#include <stdio.h>
#include <lapacke.h>
#include <conio.h>
int main (int argc, const char * argv[])
{
/*double a[5][3] = {1,1,1,2,3,4,3,5,2,4,2,5,5,4,3};*/
double b[5][2] = {-10,-3,12,14,14,12,16,16,18,16};
lapack_int info,m,n,lda,ldb,nrhs;
int i,j;
double **a;
a=(double**)malloc(5* sizeof(double*));
for (i=0;i<5;i++)
{
a[i]=(double*)malloc(3* sizeof(double));
}
a[0][0]=1;
a[0][1]=1;
a[0][2]=1;
a[1][0]=2;
a[1][1]=3;
a[1][2]=4;
a[2][0]=3;
a[2][1]=5;
a[2][2]=2;
a[3][0]=4;
a[3][1]=2;
a[3][2]=5;
a[4][0]=5;
a[4][1]=4;
a[4][2]=3;
m = 5;
n = 3;
nrhs = 2;
lda = 3;
ldb = 2;
info = LAPACKE_dgels(LAPACK_ROW_MAJOR,'N',m,n,nrhs,*a,lda,*b,ldb);
for(i=0;i<n;i++)
{
for(j=0;j<nrhs;j++)
{
printf("%lf ",b[i][j]);
}
printf("n");
}
getch();
return(info);
}
我不知道lapacke.dgels
,但尝试更改:
double **a;
a=(double**)malloc(5* sizeof(double*));
for (i=0;i<5;i++)
{
a[i]=(double*)malloc(3* sizeof(double));
}
至:
double (*a)[3];
a = malloc(5 * 3 * sizeof(double));
a
不是一个2d数组,它是一个指向单独1d数组的指针数组。将*a
传递给LAPACKE_dgels
只会给它一个指向第一行的指针。它将无法知道所有其他行是在哪里分配的,因为它们是独立分配的。它希望整个数组位于一个连续的内存块中。a
的类型必须是double*
,而不是double**
,并且在传递它时不能取消引用它。您必须使用行或列主形式(您告诉函数)将2d索引展平为1d索引。
编辑
下面的代码为m*n
double
s分配一个平面1d数组。然后,它使用公式row * n + col
将2d索引转换为1d行主索引来填充数组。如果我们想要列主索引,我们会使用col * m + row
。
#include <stdio.h>
#include <lapacke.h>
#include <conio.h>
int main (int argc, const char * argv[])
{
double b[5][2] = {-10,-3,12,14,14,12,16,16,18,16};
lapack_int info,m,n,lda,ldb,nrhs;
int i,j;
double *a;
m = 5;
n = 3;
nrhs = 2;
lda = 3;
ldb = 2;
a = malloc(m * n * sizeof(double));
a[0 * n + 0] = 1;
a[0 * n + 1] = 1;
a[0 * n + 2] = 1;
a[1 * n + 0] = 2;
a[1 * n + 1] = 3;
a[1 * n + 2] = 4;
a[2 * n + 0] = 3;
a[2 * n + 1] = 5;
a[2 * n + 2] = 2;
a[3 * n + 0] = 4;
a[3 * n + 1] = 2;
a[3 * n + 2] = 5;
a[4 * n + 0] = 5;
a[4 * n + 1] = 4;
a[4 * n + 2] = 3;
info = LAPACKE_dgels(LAPACK_ROW_MAJOR,'N',m,n,nrhs,a,lda,*b,ldb);
for(i=0;i<n;i++)
{
for(j=0;j<nrhs;j++)
{
printf("%lf ",b[i][j]);
}
printf("n");
}
getch();
return(info);
}