2014-04-18 80 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