Я новичок в этом форуме. Я недавно начал изучать c ++, как это требуется для моей работы. Я установил библиотеку GSL и BLAS на Ubuntu 12.04. Я написал код для вычисления экспоненциальной матрицы, которая прекрасно работает с библиотекой gsl. Теперь я написал код на C ++ для инвертирования сложной матрицы. Это кажется сложным. Мне сначала нужно вызвать функцию 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 Aint 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;
}
Здесь есть пара проблем.
Во-первых, вам не нужно объявлять функцию 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);
Ваш код должен хорошо скомпилироваться.