Ошибка сегментации инверсии матрицы LAPACKE C - PullRequest
0 голосов
/ 23 февраля 2019

Я пытаюсь написать код, используя библиотеки Лапаке, чтобы инвертировать сложную матрицу в C. Однако я застрял с ошибкой сегментации, которая, кажется, зависит от размера N матрицы.Более того, размер ошибки сегментации меняется каждый раз, когда я компилирую программу или что-то касаюсь.Это заставляет меня думать, что где-то код пытается получить доступ к плохо выделенной или запрещенной памяти.К сожалению, я не понимаю, как это происходит, так как, похоже, это связано с темой функций LAPACKE.Фактически, когда комментируется функция / *MatrixComplexInv(invA,A,N);*/ (в которой для инверсии вызываются функции LAPACKE), ошибка сегментации не не происходит.Ниже приведен рабочий код, который можно скомпилировать и запустить самостоятельно.

 #include <stdio.h>
#include <lapacke.h>
#include <complex.h>
#include <stdlib.h>
#include <math.h>

void  Ctranspose( double complex *, double complex * ,int );
void MatrixComplexInv(double complex *, double complex *, int );


int main(int argc,  const char * * argv) {


 int  i,j,k,N = 4;/*if N> bigger than a small number 4,6,7.. it gives segmentation fault*/

double complex *A = calloc(N*N,sizeof(double complex)),
               *b = calloc(N*N,sizeof(double complex)),
               *Ap =calloc(N*N,sizeof(double complex));


    double complex *invA =calloc(N*N,sizeof(double complex));


        for(i=0;i<N;i++){
            for(j=0;j<N;j++){ 

            A[i*N+j] = 1+sin(i*j)*i+I*j;    
            Ap[i*N+j] = 1+sin(i*j)*i+I*j;   
            }
          }

    /*Segmentation fault in this function, due to 
     * 
    LAPACKE_zgetrf(LAPACK_ROW_MAJOR, n, n, tempA , n,&n);


    LAPACKE_zgetri(LAPACK_ROW_MAJOR, n, tempA , n, &n );
    * 
    * both.
    */
    MatrixComplexInv(invA,A,N);


    for(i=0;i<N;i++){
     for(j=0;j<N;j++){ 
         for(k = 0;k<N;k++){
            b[i*N+j]+=invA[i*N + k]*Ap[k*N + j];
         }


   printf("(%lf,%lf)\t", creal(b[i*N + j]),cimag(b[i*N + j]));/*tests that the result produces the inverse matrix A^{-1}A = 1*/


    }
     printf("\n");
    }

      return 0;
    }   


    void Ctranspose( double complex *Transposed, double complex *M ,int n)
    {

    int i,j;
    for(i=0;i<n;i++)

    for(j=0;j<n;j++) Transposed[i+n*j] = M[i*n+j];
    }


    void MatrixComplexInv(double complex *invA, double complex *A, int n)
    {

    double complex *tempA = (double complex*) malloc( n*n*sizeof(double complex) );


     Ctranspose(tempA,A,n);

    /*SEGMENTATION HAPPEN IN THESE TWO FUNCTIONS*/
    LAPACKE_zgetrf(LAPACK_ROW_MAJOR, n, n, tempA , n,&n);


    LAPACKE_zgetri(LAPACK_ROW_MAJOR, n, tempA , n, &n );


     Ctranspose(invA,tempA,n);


     free(tempA);

    }

1 Ответ

0 голосов
/ 23 февраля 2019

В LAPACKE_zgetrf(LAPACK_ROW_MAJOR, n, n, tempA , n,&n); последний аргумент LAPACKE_zgetrf указывает на n, одно целое число.Напротив, аргумент ipiv должен быть указателем на массив целых чисел измерения max (m, n) для хранения сводных индексов Это может объяснить ошибку сегментации.

ipiv, вычисленное LAPACKE_zgetrf(), также должно быть предоставлено LAPACKE_zgetri() в качестве входных данных для получения правильной обратной матрицы.

...