2014-04-18 2 views
-1

어떤 몸이라도 2d 동적 배열을 정적으로 변환하여 lapacke에서 사용할 수 있습니다. dgels 함수는 C에서 정적 행렬 만 가져옵니다. malloc을 사용할 때 정답을주지 않습니다. 이 it.thankyou와 함께 작동하도록하는 방법이 malloc을 사용할 수 있습니다동적 인 2 차원 배열을 정적 배열

#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 배열은 1d 배열을 분리하기위한 포인터의 배열입니다. *aLAPACKE_dgels에 전달하면 첫 번째 행에 대한 포인터 만 제공됩니다. 독립적으로 할당 된 이후에 다른 모든 행이 할당 된 위치를 알 수있는 방법이 없습니다. 전체 배열이 하나의 인접한 메모리 블록에 있어야합니다. adouble**이 아닌 double*이어야하며 전달할 때 참조를 취소하지 마십시오. 행 또는 열의 주요 형식 (함수에 전달한 것)을 사용하여 2d 색인을 직접 1d 색인으로 전개해야합니다.

EDIT

다음 코드 m*ndouble의 방 평평한 1D 배열을 할당한다. 그런 다음 수식 row * n + col을 사용하여 2 차원 인덱스를 1 차원 행 - 주요 인덱스로 변환하여 배열을 채 웁니다. 열 주요 인덱스가 필요하면 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

어떻게 행 또는 열 전공을 사용하여 1 차원 배열에 평평하게 할 수 있습니까? 나는이 funtions을 알고 있지 않니? 위에서 malloc을 취하여 예제를 제공 할 수 있습니까? 왜냐하면 나는 처음부터 2 차원 배열 malloc에서 일하고 있고 1d malloc을 만들어야하기 때문이다. 나는 어떤 생각을 가지고 있지 않다. 고맙습니다. – 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'에는 연속적인 메모리 영역이 필요합니다. 인텔은 몇 가지 예를 가지고 있습니다 (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