动态二维数组到静态数组

时间:2014-04-18 14:42:43

标签: c dynamic static malloc lapack

任何人都知道如何将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);
}

2 个答案:

答案 0 :(得分: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 :(得分:1)

a不是2d数组,它是用于分隔1d数组的指针数组。将*a传递给LAPACKE_dgels只会给它指向第一行的指针。由于它们是独立分配的,因此无法知道所有其他行的分配位置。它希望整个数组位于单个连续的内存块中。 a必须是double*类型,而不是double**,并且在传递时不要取消引用它。您必须自己将2d索引展平为1d索引,使用行或列主要形式(您告诉函数)。

修改

以下代码分配了一个平面1d数组,其中包含m*n double s的空间。然后通过使用公式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);
}