неопределенная ссылка на `gsl_linalg_complex_LU_decomp_'

Я новичок на этом форуме. Я недавно начал изучать c++, так как это необходимо для моей работы. Я установил библиотеку GSL и BLAS на Ubuntu 12.04. Я написал код для вычисления экспоненциальной матрицы, который отлично работает с библиотекой gsl. Теперь я написал код С++ для инвертирования сложной матрицы. Это кажется сложным. Сначала мне нужно вызвать функцию gsl gsl_linalg_complex_LU_decomp(), чтобы определить разложение матрицы, а затем вызвать другую функцию gsl, чтобы вычислить обратную матрицу. Однако программа, приведенная ниже, не компилируется в Ubuntu 12.04. я использую команду

g++ MatInv.cpp -o MatInv.exe -lgsl -llapack.

Ошибка вывода на терминале:

/tmp/ccUVd80t.o: In function `main':MatInv.cpp.text+0x638): undefined reference to `gsl_linalg_complex_LU_decomp_'
collect2: ld returned 1 exit status

Я искал в сети эту проблему, но не могу найти правильный ответ на мою проблему. Код выглядит следующим образом (опять же, я новичок в C++, так что вы можете найти это очень примитивным способом написания кода). Здесь я только вычисляю разложение матрицы. Пожалуйста, дайте мне знать, что здесь не так. Спасибо за вашу помощь.

#include <iostream>
#include <gsl/gsl_matrix_complex_double.h>
#include <gsl/gsl_linalg.h>
#include <gsl/gsl_complex.h>
#include <gsl/gsl_complex_math.h>
#include <gsl/gsl_cblas.h>
#include <gsl/gsl_matrix.h>
#include <cmath>
#include <complex>
#include <fstream>


using namespace::std;


typedef complex<double> cd;


extern "C" int gsl_linalg_complex_LU_decomp_(gsl_matrix_complex *A, gsl_permutation *p, int signum);


//**************************************************************************


int main()
{


//Here we define matrix A


int dimA=3;          //dimensions of the matrix A
cd im(0.,1.),u(1.,0.);
cd **A,**B; 
A= new cd *[dimA];
B= new cd *[dimA];



for(int i=0; i<dimA; i++){ 
 A[i]= new cd [dimA];
 B[i]= new cd [dimA];
}


for(int i=0; i< dimA; i++){ // Initializing the matrix 
 for(int j=0; j<dimA; j++){
  A[i][j]=(0.,0.);
  B[i][j]=(0.,0.);
 }
}


ofstream Lmat;
Lmat.open("Mat.dat");
for(int i=0; i< dimA; i++){
 for(int j=0; j< dimA; j++){
  if(i==j)A[i][j]=.1*(i+1)*u+.2*(j+1)*u;
  else A[i][j]=.1*(i+1)*u+.2*(j+1)*im;
  Lmat<<A[i][j];
 }
 Lmat<<endl;
}


Lmat.close();


gsl_matrix_complex *gsl_A= gsl_matrix_complex_calloc(dimA,dimA);


for(int i=0;i<dimA;i++){
 for(int j=0;j<dimA;j++){
  double A_elem_re = A[i][j].real();
  double A_elem_im = A[i][j].imag();
    gsl_matrix_complex_set(gsl_A,i,j,gsl_complex_rect(A_elem_re,A_elem_im));
 }
} 


gsl_permutation *p=gsl_permutation_alloc(dimA);
int signum;


gsl_linalg_complex_LU_decomp_(gsl_A, p, signum);




 gsl_permutation_free (p);


 return 0;
}

person OPP    schedule 17.04.2015    source источник


Ответы (1)


Здесь есть пара проблем.

Во-первых, вам не нужно объявлять функцию gsl_linalg_complex_LU_decomp, чтобы вы могли избавиться от строки

extern "C" int gsl_linalg_complex_LU_decomp_(gsl_matrix_complex *A, gsl_permutation *p, int signum);

Во-вторых, когда вы вызываете эту функцию позже, у вас возникает пара проблем, во-первых, вам нужно иметь ошибочное подчеркивание в имени, поэтому избавьтесь от него, а во-вторых, параметр signum должен быть int * (т.е. указателем на int), а не int как вы делаете сейчас.

Если вы замените эту строку на

gsl_linalg_complex_LU_decomp(gsl_A, p, &signum);

ваш код должен компилироваться нормально.

person Simon Gibbons    schedule 17.04.2015
comment
Спасибо, Саймон. Это работает просто отлично! :-) Но мне просто интересно, в других моих кодах у меня есть подчеркивание при вызове функций GSL, и это работает нормально. На самом деле я где-то читал, что это необходимо для вызова подпрограммы Fortran из кода C++. Это правильно? Спасибо еще раз. Я потратил на это два дня. :-( - person OPP; 17.04.2015