2014-04-18 62 views
-1

任何机构都知道如何将2d动态数组转换为静态,以便我可以在lapacke中使用它。 dgels函数只能在c中使用静态矩阵? 当我使用malloc它不会给出正确的答案。我怎样才能使用malloc,使其与it.thankyou工作动态二维数组到静态数组

#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); 
} 

回答

1

a不是2d数组,它是一个指向数组的指针数组。通过*aLAPACKE_dgels只给它一个指向第一行的指针。由于它们是独立分配的,因此无法知道所有其他行的分配情况。它希望整个阵列位于单个连续的内存块中。 a必须是double*,而不是double**,并且在传递它时不要对其进行解除引用。您必须使用行或列主表单(您告诉该函数)将2d索引变成1d索引。

EDIT

下面的代码分配与空间m*ndouble秒的平坦一维数组。然后通过使用公式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); 
} 
+0

我怎么可以将它们压平成1d数组使用行或列主要用于?我不知道这个功能? 你可以通过从上面的malloc来给出例子。因为我从一开始就在2d数组malloc中工作,而且我必须创建1d malloc。我没有任何想法:thanx – user3546028

3

我不知道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)); 
+1

确切地说,'dgels'需要一个连续的内存区域。英特尔有一些例子[https://software.intel.com/sites/products/documentation/doclib/mkl_sa/11/mkl_lapack_examples/lapacke_dgels_row.c.htm]。 –

+0

这很聪明,我没有想到如何让编译器为你做索引计算。 – pat

+0

@marian:你的程序工作正常:但是在我真正的程序中很大:double(* a)[3]的初始化;正处于程序的中间:所以我必须使用特定的[设计]。而不是[3]。所以比我应该如何写malloc? – user3546028