lapack dgels_ segmentation fault 11

余生颓废 提交于 2019-12-14 02:48:36

问题


I am trying to use LAPACK's dgels_ in C to solve a linear least squares problem. I have to read the matrix A (assumed to have full rank and m>=n) and a vector b from 2 text files. I can easily compile my code, but when i try to run it I get a "segmentation fault 11", but I can't really see why. It is my first time using LAPACK so I don't know if maybe I am using the dgels_ function wrong?? The way I get it the solution x will be overwritten in the vector b? :

lssolve.c:

#include <stdlib.h>
#include <stdio.h>
#include "linalg.h"

/* C prototype for LAPACK routine DGELS */
void dgels_(const char * trans, const int * m, const int * n, const int * 
nrhs, double * A, const int * lda, double * B,  const int * ldb, double * work,                     
int * lwork,int * info);

int main(int argc, char * argv[]) {
vector_t * b_t = NULL;
matrix_t * A_t = NULL;
char trans = 'N';
int m, n, nrhs, mb, lda, ldb, info, lwork;
double optwork;
double * work;

// we read the matrix A and the vector b:
b_t = read_vector("b.txt");
A_t = read_matrix("A.txt");
m = A_t-> m;             //number of rows in A
n = A_t-> n;             //number of columns in A
nrhs = 1;                //number of columns in B (will always be 1, since we read b_t with read_vector)
mb = b_t -> n;           //number of rows in B

if (mb != m ) {              //end program if A and B doesn't have the same number of rows
    free(A_t);
    free(b_t);

    fprintf(stderr, "Sorry, but the matrix A and the vector b have incompatible dimensions. Good Bye!\n");
            exit(EXIT_FAILURE);
}

//We make A and B into the wanted input form for the dgels_-function:
double * B = b_t -> v;
double ** A = A_t ->A;

    lda = m;
    ldb = mb;

    //we calculate the optimal size of the work array:
    lwork = -1;
    dgels_(&trans, &n, &m, &nrhs, *A, &lda, B, &ldb, &optwork, &lwork, &info);

    lwork = (int)optwork;

    //we allocate space for the work array:
    work = (double*)malloc( lwork*sizeof(double));

    //solving the least squares problem:
    dgels_(&trans, &n, &m, &nrhs, *A, &lda, B, &ldb, work, &lwork, &info);

    //Check whether there was an successful exit:
    if (info > 0){
        fprintf(stderr, "Sorry, but illegal arguments were used, and therefore a least square solution cannot be computes. Good Bye!\n");
        exit(EXIT_FAILURE);
    } else if(info < 0){
        fprintf(stderr, "Sorry, but A doesn't have full rank, and therefore a least square solution cannot be computed. Good Bye!\n");
        exit(EXIT_FAILURE);
    }

    //Saving the least square problem as a vector_t:
    vector_t * x = NULL;
    x->n = mb;
    x->v = B;

    print_vector(x);

  //Free memory
  free_vector(b_t);
  free_matrix(A_t);
  free_vector(x);

  return(EXIT_SUCCESS);
  }

I am using the functions read_matrix, read_vector, print_vector, print_matrix and free_vector, which is why I use the struct vector_t and matrix_t:

 typedef struct vector {
 unsigned long n;   /* length of vector                     */
 double * v;        /* pointer to array of length n         */
 } vector_t;

 typedef struct matrix {
 unsigned long m;   /* number of rows                       */
 unsigned long n;   /* number of columns                    */
 double ** A;       /* pointer to two-dimensional array     */
 } matrix_t;

I don't think that anything is wrong with read_vector and read_matrix because I can easily do this and use print_vector or print_matrix before I do all of the other operations.


回答1:


You dereference a NULL pointer here, causing the segfault:

//Saving the least square problem as a vector_t:
vector_t * x = NULL;
x->n = mb;
x->v = B;

Maybe you should use/create a new vector_t instead of just a pointer to a vector_t?



来源:https://stackoverflow.com/questions/33709335/lapack-dgels-segmentation-fault-11

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!