Assigning complex values in gsl

可紊 提交于 2019-12-11 07:26:09

问题


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):

  1. 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)
  2. ibid. in line Include Directories type: C:\Users\ ...(your GSL build directory path)... \gsl\;$(IncludePath)
  3. ibid. in line Library Directories type: C:\Users\ ...(your GSL build directory path)... \gsl\Release;$(LibraryPath)
  4. 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)
  5. 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
  6. Buld your application and run it

Good luck!



来源:https://stackoverflow.com/questions/46526274/assigning-complex-values-in-gsl

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