在gsl中分配复杂值

时间:2017-10-02 13:17:39

标签: c visual-studio dll complex-numbers gsl

我正在尝试在我的项目中使用GSL complex numberscomplex vectorscomplex matrices。我使用的是VS2010,我在配置属性> C / C ++> General>其他包含目录中添加了库的地址。但我有一个愚蠢的问题。据我了解,我无法使用=为彼此分配两个gsl_complexgsl_vector_complexgsl_matrix_complex

对于向量,我必须使用gsl_vector_complex_set和矩阵gsl_matrix_complex_set。但是对于gsl_complex,我只找到 GSL_SET_COMPLEX ,其中我应该将实部和虚部分别作为2个参数给出:

GSL_SET_COMPLEX (zp, real, imaginary)

在我的代码中我有这样的功能:

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)));
    }
}

使用此功能,我收到以下错误:

  

错误LNK1120:2未解析的外部参考。

     

错误LNK2001:未解析的外部符号“_hypot”。

     

错误LNK2001:未解析的外部符号“_log1p”。

     

错误LNK2001:未解析的外部符号“_log1p”。

我不明白这些错误背后的原因。但我改写了我的代码:

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);
    }
}

这里当for的第二行被注释时,没有错误。但当我取消注释时,我得到以下内容:

  

错误LNK1120:2个未解析的外部参考。

     

错误LNK2001:未解析的外部符号“_log1p”。

     

错误LNK2019:在函数“_gsl_complex_div”中引用未解析的外部符号“_hypot”。

     

错误LNK2019:在函数“_gsl_complex_logabs”中引用未解析的外部符号“_log1p”。

我的代码中没有_gsl_complex_div_gsl_complex_logabs函数。所以我很确定问题出在这里。但我也不能在这里使用GSL_SET_COMPLEX。

有人可以帮我吗?难道没有办法直接为gsl_complex赋值吗?

1 个答案:

答案 0 :(得分:0)

最好在这里发布所有代码,因此,我立即使用了GSL the lowest of the examples中的代码。我做了一些小改动:

#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: (从红色箭头下方开始,与GSL示例中的预期输出不匹配) 要获取输出,您需要使用IDE(我使用Visual Studio 2015):

  1. 进入“您的应用程序”属性页->配置属性-> VC ++目录->(右窗格)在可执行目录行中,键入: C:\ Users \ ... (您的GSL构建目录路径)... \ gsl \ Release; $(ExecutablePath)
  2. 同上。在包含目录行中键入: C:\ Users \ ...(您的GSL构建目录路径)... \ gsl \; $(IncludePath)< / strong> 同上。在库目录行中键入: C:\ Users \ ...(您的GSL构建目录路径)... \ gsl \ Release; $(LibraryPath)
  3. 在下面的左窗格中,在预处理器定义行中选择C / C ++-> Peprocessor->(右窗格),类型: WIN32; _DEBUG; _CONSOLE; GSL_DLL;%(PreprocessorDefinitions )(我使用调试模式,创建了空的控制台应用程序)。保存设置(按“应用”和“确定”按钮)
  4. C:\ Users \ 复制并放入应用程序项目文件夹 gsl.dll gslcblas.dll 的Debug目录中... (您的GSL构建目录路径)... \ gsl \ Release 目录
  5. 可以运行您的应用程序

祝你好运!