问题
I am trying to use GSL for complex numbers, complex vectors and complex matrices in my project. I am using VS2010 and I added the address of library in Configuration Properties>C/C++>General>Additional Include Directories. But I have a stupid problem. As far as I understood, I can not use = to assign two gsl_complex, gsl_vector_complex or gsl_matrix_complex to each other.
For vectors I have to use gsl_vector_complex_set and for matrices gsl_matrix_complex_set. But for gsl_complex, I only found GSL_SET_COMPLEX in which I should give the real and imaginary parts seperatly as 2 arguments:
GSL_SET_COMPLEX (zp, real, imaginary)
In my code I have such function:
gsl_complex cmx, cmx2;
void vector_complex_exp(gsl_vector_complex *v)
{
for (i = 0; i < v->size; i++)
{
gsl_vector_complex_set(v, i, gsl_complex_exp(gsl_vector_complex_get(v, i)));
}
}
Using this, I get following errors:
error LNK1120: 2 Unresolved external references.
error LNK2001: Unresolved external symbol "_hypot".
error LNK2001: Unresolved external symbol "_log1p".
error LNK2001: Unresolved external symbol "_log1p".
I didn't understand the reason behind these errors. But I rewrite my code like this:
void vector_complex_exp(gsl_vector_complex *v)
{
for (i = 0; i < v->size; i++)
{
cmx = gsl_vector_complex_get(v, i);
//cmx2 = gsl_complex_exp(cmx);
gsl_vector_complex_set(v, i, cmx2);
}
}
Here when the second line in for is commented, there's no error. But when I uncomment it I get the following:
error LNK1120: 2 non-resolved external references.
error LNK2001: Unresolved external symbol "_log1p".
error LNK2019: Reference to non-resolved external symbol "_hypot" in function "_gsl_complex_div".
error LNK2019: Reference to non-resolved external symbol "_log1p" in function "_gsl_complex_logabs".
I don't have any _gsl_complex_div or _gsl_complex_logabs function in my code. So I am pretty sure that the problem is with assignment here. But I can not use GSL_SET_COMPLEX here too.
Can someone help me with this? Is there really no way to assign a value to gsl_complex directly?
回答1:
It would be better if you published all your code here, therefore, I immediately used this code from the lowest of the examples of the GSL. I made some small changes:
#include <stdio.h>
#include <gsl/gsl_math.h>
#include <gsl/gsl_eigen.h>
int main(void)
{
double data[] = { -1.0, 1.0, -1.0, 1.0,
-8.0, 4.0, -2.0, 1.0,
27.0, 9.0, 3.0, 1.0,
64.0, 16.0, 4.0, 1.0 };
gsl_matrix_view m
= gsl_matrix_view_array(data, 4, 4);
gsl_vector_complex *eval = gsl_vector_complex_alloc(4);
gsl_matrix_complex *evec = gsl_matrix_complex_alloc(4, 4);
gsl_eigen_nonsymmv_workspace * w = gsl_eigen_nonsymmv_alloc(4);
gsl_eigen_nonsymmv(&m.matrix, eval, evec, w);
gsl_eigen_nonsymmv_free(w);
gsl_eigen_nonsymmv_sort(eval, evec, GSL_EIGEN_SORT_ABS_DESC);
{
int i, j;
for (i = 0; i < 4; i++)
{
gsl_complex eval_i
= gsl_vector_complex_get(eval, i);
gsl_vector_complex_view evec_i
= gsl_matrix_complex_column(evec, i);
printf("\n eigenvalue = %g + %gi\n",
GSL_REAL(eval_i), GSL_IMAG(eval_i));
printf(" eigenvector = \n");
for (j = 0; j < 4; ++j)
{
gsl_complex z =
gsl_vector_complex_get(&evec_i.vector, j);
printf(" %g + %gi\n", GSL_REAL(z), GSL_IMAG(z));
}
}
}
gsl_vector_complex_free(eval);
gsl_matrix_complex_free(evec);
system("pause");
return 0;
}
Output of this code: (from the red arrow and below there is a mismatch with the expected output in the GSL example) To get my output, you need to IDE (I use Visual Studio 2015):
- into "your_application" Property pages -> Configuration Properties -> VC++ Directories -> (right pane)in line Executable Directories type: C:\Users\ ...(your GSL build directory path)... \gsl\Release;$(ExecutablePath)
- ibid. in line Include Directories type: C:\Users\ ...(your GSL build directory path)... \gsl\;$(IncludePath)
- ibid. in line Library Directories type: C:\Users\ ...(your GSL build directory path)... \gsl\Release;$(LibraryPath)
- Below, in the left pane, select C/C++ -> Peprocessor -> (right pane) in line Preprocessor Defenition type: WIN32;_DEBUG;_CONSOLE;GSL_DLL;%(PreprocessorDefinitions) (I use Debug mode, created empty console application). Save settings (press "Apply" and "OK" buttons)
- Copy and put into Debug directories of your application project folder gsl.dll and gslcblas.dll from C:\Users\ ...(your GSL build directory path)... \gsl\Release directory
- Buld your application and run it
Good luck!
来源:https://stackoverflow.com/questions/46526274/assigning-complex-values-in-gsl