在lapack的dgels函数中使用malloc

在lapack的dgels函数中使用malloc,c,malloc,lapack,C,Malloc,Lapack,当我在第一个矩阵中使用mallocfunction时。它没有给出正确的值。但是没有malloc它给出了正确的答案。有谁能告诉我,当我使用malloc并创建一个矩阵并将它们存储在相邻位置时,有什么错误吗 /* Calling DGELS using row-major order */ #include <stdio.h> #include <lapacke.h> #include <conio.h> #include <malloc.h> in

当我在第一个矩阵中使用
malloc
function时。它没有给出正确的值。但是没有
malloc
它给出了正确的答案。有谁能告诉我,当我使用
malloc
并创建一个矩阵并将它们存储在相邻位置时,有什么错误吗

/* Calling DGELS using row-major order */

#include <stdio.h>
#include <lapacke.h>
#include <conio.h>
#include <malloc.h>

int main ()
{
    //  double a[6][2] = {{1,2},{1,4},{1,6},{1,8},{1,10},{1,12}};

    //double outputArray[3][1];
    int designs=6;
    double **a;


    int i,j,d,i_mal;
    lapack_int info,m,n,lda,ldb,nrhs;
    //double outputArray[6][1] = {{2},{4},{4},{5},{5},{7}};
    double **outputArray;

    a=(double**)malloc(6* sizeof(double*));
    for (i=0;i<6;i++)
    {
        a[i]=(double*)malloc(2* sizeof(double));
    }
    //for storing them on particular places
    for (i=0;i<6;i++)
    {
        for(j=0;j<2;j++)
        {
            outputArray[i]=&outputArray[j][i];
        }
    }
    //putting values
    for (i=0;i<6;i++)
    {
        for(j=0;j<2;j++)
        {
            printf("put a[%d][%d]",i,j);
            scanf("%lf",&a[i][j]);
        }
    }

    outputArray = (double**) malloc(6* sizeof(double*)); 
    outputArray[0]=(double*) malloc(6* sizeof(double));
    for (i=0;i<designs;i++)
    {
        outputArray[i]=&outputArray[0][i];
    }

    for (i=0;i<6;i++)
    {
        printf("put first value");
        scanf("%lf",&outputArray[i][0]);
    }


    m = 6;
    n = 2;
    nrhs = 1;
    lda = 2;
    ldb = 1;

    info = LAPACKE_dgels(LAPACK_ROW_MAJOR,'N',m,n,nrhs,*a,lda,*outputArray,ldb);
    printf("\n coefficients are:");
    for(i=0;i<n;i++)
    {
        for(j=0; j < nrhs; j++)
        {
            printf("%lf ",outputArray[i][j]);
        }
        printf("\n");
    }
    getch();

    return (info);
}
/*使用行主顺序调用DGEL*/
#包括
#包括
#包括
#包括
int main()
{
//双a[6][2]={{1,2},{1,4},{1,6},{1,8},{1,10},{1,12};
//双输出阵列[3][1];
int设计=6;
双**a;
int i,j,d,i_mal;
lapack_int info,m,n,lda,ldb,nrhs;
//双输出阵列[6][1]={2}、{4}、{4}、{5}、{5}、{7};
双**输出阵列;
a=(双**)malloc(6*sizeof(双*);
对于(i=0;i的答案,您可以对矩阵
a
使用相同的技巧:

    double** a=malloc(m*sizeof(double*));
    if(a==NULL){printf("malloc failed\n");}
    a[0]=malloc(m*n*sizeof(double));
    if(a[0]==NULL){printf("malloc failed\n");}
    for (i=0;i<m;i++){
        a[i]=&a[0][i*n];
    }

malloc
分配内存,它不能保证内存将被分配到哪里,或者它是否是连续的。只要返回值不是
NULL
,我就看不出
malloc
如何返回“不正确的值”。这行
outputArray[I]的前两个循环背后到底是什么意思=&outputArray[j][i];
。在任何情况下,它都会引发未定义的行为,因为
outputArray
指向“无处”,将说从未初始化过。抱歉,首先存储它们时,它应该是一个矩阵而不是输出阵列。问题在于在lapack中使用2d malloc。当我使用它时,结果是错误的。事实可能在于lapack使用静态c矩阵。但我必须使用malloc。因此,如何将动态数组转换为静态数组。thankyou@Mgetz我从来没见过n一个返回非连续内存的
malloc()
实现……它是如何工作的?(除非您指的是相对于先前返回的内存块的连续性,也就是说。)@twalberg对
malloc
的每次调用都返回一个连续内存块,但并不保证每次调用都是彼此连续的。
/* Calling DGELS using row-major order */

#include <stdio.h>
#include "lapacke.h"
//#include <conio.h>
#include <malloc.h>

int main ()
{
    //double a[3][2] = {{1,0},{1,1},{1,2}};

    double **outputArray;
    int designs=3;
    int i,j,d,i_mal;
    lapack_int info,m,n,lda,ldb,nrhs;

    m = 3;
    n = 2;
    nrhs = 4;
    lda = n;
    ldb = nrhs;

    //double outputArray[3][1] = {{6},{0},{0}};
    double** a=malloc(m*sizeof(double*));
    if(a==NULL){printf("malloc failed\n");}
    a[0]=malloc(m*n*sizeof(double));
    if(a[0]==NULL){printf("malloc failed\n");}
    for (i=0;i<m;i++){
        a[i]=&a[0][i*n];
    }
    a[0][0]=1;
    a[0][1]=0;
    a[1][0]=1;
    a[1][1]=1;
    a[2][0]=1;
    a[2][1]=2;


    outputArray = malloc(m* sizeof(double*));
    if(outputArray==NULL){printf("malloc failed\n");}
    outputArray[0]=malloc(m*nrhs* sizeof(double));
    if(outputArray[0]==NULL){printf("malloc failed\n");}
    for (i=0;i<m;i++){
        outputArray[i]=&outputArray[0][i*nrhs];
    }

    for (i=0;i<m;i++)
    {
        printf("put first value");
        scanf("%lf",&outputArray[i][0]);
    }



    info = LAPACKE_dgels(LAPACK_ROW_MAJOR,'N',m,n,nrhs,*a,lda,*outputArray,ldb);

    for(i=0;i<n;i++)
    {
        for(j=0;j<nrhs;j++)
        {
            printf("%lf ",outputArray[i][j]);
        }
        printf("\n");
    }
    //getch();

    free(a[0]);
    free(a);
    free(outputArray[0]);
    free(outputArray);
    return (info);
}