windows 环境下使用GSL

GNU Scientific Library(GSL)是一个为C和C++程序员提供的科学数值运算库。该科学计算库异常强大,提供了如下方面的支持:
Complex Numbers               Roots of Polynomials          Special Functions
Vectors and Matrices           Permutations                     Sorting
BLAS Support                      Linear Algebra                    Eigensystems
Fast Fourier Transforms      Quadrature                         Random Numbers
Quasi-Random Sequences  Random Distributions          Statistics
Histograms                          N-Tuples                             Monte Carlo Integration
Simulated Annealing            Differential Equations         Interpolation
Numerical Differentiation     Chebyshev Approximation  Series Acceleration
Discrete Hankel Transforms Root-Finding                       Minimization
Least-Squares Fitting          Physical Constants             IEEE Floating-Point
Discrete Wavelet Transforms                                          Basis splines

对于经常处理复杂数学计算的开发人员来说,无疑是莫大的解脱~
该项目的主页是:http://www.gnu.org/software/gsl/gsl.html
遗憾的是GSL不支持windows平台,不过所幸的是有人做了GSL在windows上的移植工作,名唤WinGSLhttp://www6.in.tum.de/~kiss/WinGsl.htm),虽然版本比较老,只更新到04年,但对于一般人来说,还是足够了。
之前写过一点计算机视觉方面的程序,涉及到矩阵运算都通过VC调用matlab计算引擎来处理。虽然比较方便,但是前提是要安装matlab,并且调用计算引擎进行数据交换的速度也不快。这次数据挖掘作业,会设计到一些矩阵分解,特征值求解之类的运算,为了偷懒,决定试用一下WinGSL。

在VC6.0下配置WinGSL极为简单:
1.http://www6.in.tum.de/~kiss/WinGsl.htm下载最新的WinGSL(当前是1.4版),解压到某个目录,假设为D:WinGSL
2.将WinGSL使用的lib和头文件加入vc6的设置:
vc6.0->tools->options->directories
将D:WinGSLlib,D:WinGSL分别加入到库文件和头文件的搜索路径中。
3.将WinGsl.dll和WinGslD.dll复制到%VC_HOME%/VC98Bin下,或者是复制到新建的VC6工程的主目录下。
4.在新建的工程中将要使用的库加入到连接器中:
vc6.0->project->settings->link->object/library modules。
配置完毕后测试如下代码:

#include <stdio.h>
#include <gsl/gsl_linalg.h>
int
main (void)
{
  double a_data[] = { 0.18, 0.60, 0.57, 0.96,
                      0.41, 0.24, 0.99, 0.58,
                      0.14, 0.30, 0.97, 0.66,
                      0.51, 0.13, 0.19, 0.85 };
  double b_data[] = { 1.0, 2.0, 3.0, 4.0 };
  gsl_matrix_view m
    = gsl_matrix_view_array (a_data, 4, 4);
  gsl_vector_view b
    = gsl_vector_view_array (b_data, 4);
  gsl_vector *x = gsl_vector_alloc (4);
  int s;
  gsl_permutation * p = gsl_permutation_alloc (4);
  gsl_linalg_LU_decomp (&m.matrix, p, &s);
  gsl_linalg_LU_solve (&m.matrix, p, &b.vector, x);
  printf ("x = ");
  gsl_vector_fprintf (stdout, x, "%g");
  gsl_permutation_free (p);
  gsl_vector_free (x);
  return 0;
}

编译,链接通过,说明配置成功。但是运行结果居然出错!

这可是GSL网站上的标准示例…

debug了一下,发现x计算正确,但是调用 gsl_vector_fprintf (pf, x, “%g”);时即出错…

汗~~
于是重新google了一下,发现sourceforge上还有个GnuWin32,专门移植负责GNU的项目到win32平台。自然也包括了GSL for windows移植版,当前版是1.8,比WinGSL要新一些,可以再这里下载: http://gnuwin32.sourceforge.net/packages/gsl.htm

于是乎高高兴兴的down了下来,类似的重新配置了一遍,运行上述程序,结果…

可以正确的输出结果,但是冒出个debug错误~~程序结束时chkesp检查ESP指针时发现不一致…汗~~~

PS:由于VC6.0对模板的支持不好,尤其是不支持模板类的声明和定义分开,所以很多以模板编写的库都无法在VC6.0下使用,例如Blitz++和MTL
GSL for windows 1.8带的库文件是.a文件,不是windows下常见的.lib格式,因此可以用vc6自带的lib工具根据.def模块定义文件生成.lib文件:

lib.exe /machine:i386 /def:libgsl.def

lib.exe /machine:i386 /def:libgslcblas.def

若提示找不到mspdb60.dll,则复制一份mspdb60.dll到C:WINDOWSsystem32或者%VC_HOME%VC98Bin目录下即可。一般说来,mspdb60.dll在%VC_HOME%CommonMSDev98Bin下面可以找到,若也没有,则从网上down一个即可。
若要使用动态链接库,则需要在VC的预编译器定义中加入GSL_DLL:
vc6.0->project->settings->C/C++->Preprocessor definitions

然后将GSL的BIN目录下的libgslcblas.dll、libgsl.dll拷贝到C:WINDOWSsystem32目录下即可。

下载GSL最新版1.12,在Uubuntu 8.10上测试上述程序通过。
重新试验了一下GSL for windows 1.8。最上面的代码可以编译,但运行时仍然出错,但是用gsl官网上的一个最简单sample却可正确编译运行。这说明不是环境配置的问题,是该GSL for windows 1.8自身的问题。可能是版本过低,可能是由于导出库函数的接口不一致等原因导致在windows下不稳定。

最后,强烈建议直接在linux下使用最新版的gsl。

Creative Commons License
This work, unless otherwise expressly stated, is licensed under a Creative Commons Attribution-No Derivative Works 2.5 China Mainland License.
标签:, ,
此条目发表在 学无止境 分类目录,贴了 , , 标签。将固定链接加入收藏夹。

windows 环境下使用GSL》有 4 条评论

  1. sasha 说:

    好…it’s helpful. :cool:

    回复

  2. hh 说:

    居然百度到了这儿~~~学习

    回复

    foelin reply on 四月 25th, 2010:

    哈哈,我的rank还是不低的 ;-)

    回复

  3. MAYDAY 说:

    收藏了,it is very helpful, thanks ^_^

    回复

发表评论

电子邮件地址不会被公开。 必填项已被标记为 *

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>