GSL(C数学运算库)安装和使用教程

当前库可以在linux上面运行,也可以在windows环境中visual studio进行编译测试,所以安装教程包含这两个大环境下面。

windows

在windows10中VS2019中配置GSL库(version: 2.7)

1. GSL简介

GSL官网

GNU Scientific Library (GSL) 是一个供 C 和 C++ 程序员使用的数字库。它是 GNU 通用公共许可证下的免费软件。

该库提供了广泛的数学例程,例如随机数生成器、特殊函数和最小二乘拟合。总共有超过 1000 个函数和一个广泛的测试套件,Matlab 的大部分函数几乎都能借助它实现。

二、本机环境
win10、vs2019

3. 实现方法

有两种方法可以使用,直接在 Visual Studio 2019 中下载 NuGet 程序包;在 GitHub 上拉取别人做好的源码包,自己编译生成最新的库文件然后集合到自己的项目中进行开发测试。
方法一:下载 NuGet 程序包
打开 VS2019 — 项目 — 管理 NuGet 程序包 — 搜索 gsl

NuGet

选择你自己相应的环境 x86 或者 x64,安装完成后,这个包会出现你的项目目录的packages 中,include头文件即可使用。

 方法二:GitHub 下载源码包

  1. 使用 git 下拉 git clone https://github.com/BrianGladman/gsl.git my_gsl。如果下载太慢,可以使用这个命令:git clone https://github.com.cnpmjs.org/BrianGladman/gsl.git my_gsl。如果不想自己编译可以直接去这里下载别人编译好的(包含有 release 和 debug 的 x86、x64 版本)https://download.csdn.net/download/libaineu2004/15317425。若使用别人编译好的直接跳至第5步
  2. vs2019打开并运行 build.vc \ gsl.lib.sln 即可实现静态库的编译 — 在 lib 目录中生成 .lib 文件
  3. vs2019打开并运行 build.vc \ gsl.dll.sln 即可实现动态库的编译 — 在 dll 目录中生成 .dll 文件以上两个工程直接运行会出现一些报错,可以参考这篇文章的前半部分来完成配置:VS2019配置GSL库
  4. 为项目添加相应的头文件和 lib 库(据我的观察应该是GSL 2.7版本的)
1. 添加头文件:项目 — 属性 — C/C++ — 常规 — 附加包含目录
E:\GSL\gsl\include
这里需要注意,这种一般是直接发布库的形式,然后通过编译脚本的方式进行编译。
在vs2019中本人是直接VC++目录>>包含目录将本工程目录中包含的gsl头文件目录直接给包含进来这种方式进行库的使用
2. 添加 lib 静态库路径:项目 — 属性 — 链接器 — 常规 — 附加库目录
E:\GSL\gsl\lib\x64\Debug
3. 添加引用的 lib 文件名:项目 — 属性 — 链接器 — 输入 — 附加依赖项
cblas.lib;gsl.lib

配置时要注意自己工程的版本,debug 版本和 release 版本都有相应的 lib 库。

完成以上步骤即可直接 include 头文件开始开心调库了!!
大家在调库的时候可以参考下面给出的官方API文档,很有帮助哦~

如何实现Windows MSVC的源码编译?

http://www.gnu.org/software/gsl/extras/native_win_builds.html

有热心网友实现了:

https://github.com/BrianGladman/gsl

本人使用的是热心网友提供的代码,编译过程提示MSB8020 无法找到 v143 的生成工具(平台工具集 =“v143”)错误,解决方法是通过如下:

将v143修改为visual studio2019的v142即可 

请下载源码包,然后:

1、使用VS2019打开\gsl-master\build.vc\gsl.lib.sln即可实现静态库的编译,编译生成的结果文件的路径是\gsl-master\lib

2、使用VS2019打开\gsl-master\build.vc\gsl.dll.sln即可实现动态库的编译,编译生成的结果文件的路径是\gsl-master\dll

编译完成,会在路径\gsl-master\gsl统一整理好*.h头文件

4. 测试

通过如下一段代码进行库编译与添加正确性测试

#include <gsl/gsl_sf_bessel.h>

int test(void)
{
    double x = 5.0;
    double y = gsl_sf_bessel_J0(x);
    printf("J0(%g) = %.18e\n", x, y);
    return 0;
}

四、参考文章

GSL官网API文档
C++ 数学计算库汇总
在VS中添加lib库的三种方法

————————————————
版权声明:本文为CSDN博主「G.Chenhui」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/G_C_H/article/details/120924797

linux

GSL安装和使用教程
GSL 简介
GSL 下载
GSL安装
GSL使用
GSL常用函数(持续更新)
矩阵运算
1.Matrix operations 详见手册8.4.9
2.矩阵乘法
2.矩阵求逆
GSL 简介
gsl(GNU Scientific Library)是专门为应用数学和科学技术领域的数值计算提供支持的软件库。gsl使用C语言编写,同时也为其他语言做了相应的封装。gsl在GNU通用公共许可下是免费的。该函数库提供了广泛的数学算法的实现函数,包括随机数生成器,特殊函数和最小二乘拟合等等。目前该函数库提供有超过1000个函数,这些函数包含的范围有:复数计算、多项式求根、特殊函数、向量和矩阵运算、排列、组合、排序、线性代数、特征值和特征向量、快速傅里叶变换(FFT)、数值积分、随机数生成、随机数分布、统计、蒙特卡洛积分、模拟退火、常微分方程组、插值、数值微分、方程求根、最小二乘拟合、小波变换等

GSL 下载
下载GSL安装文件: 链接: http://mirrors.ustc.edu.cn/gnu/gsl.

GSL文档在线:链接:https://www.gnu.org/software/gsl/doc/html/index.html.

GSL文档下载:链接:https://www.gnu.org/software/gsl/doc/latex/gsl-ref.pdf.

GSL安装
1. 解压压缩包:$ tar -zxvf gsl-2.7.tar.gz

2. 创建安装目录:$ mkdir /home/ccchenji/Desktop/gsl_gcc
注意:ccchenji是我系统的用户名,这里要换成你的系统的用户名。

3. 进入源码目录:$ cd /home/ccchenji/Desktop/gsl-2.7
注意:ccchenji是我系统的用户名,这里要换成你的系统的用户名。

4.配置configure文件

# 参数含义
# CC:指定编译工具链
# --prefix: 指定库的安装目录
# --host: 指定安装平台,可选,交叉编译要制定安装平台如在arm上编译 --host=arm
# ./configure -h: 可以得到配置的帮助信息

# linux上安装
$ ./configure CC="gcc" --prefix=/home/ccchenji/Desktop/gsl_gcc
#注意:ccchenji是我系统的用户名,这里要换成你的系统的用户名。

5.使用make进行编译

$ make
1
6.使用make install进行安装

$ make install
1
7.使用make installcheck检查安装是否成功

$ make installcheck
1
GSL使用
1.新建工程文件夹

$ mkdir /home/ccchenji/Desktop/gsl_test
#注意:ccchenji是我系统的用户名,这里要换成你的系统的用户名。
1
2
2.新建makefile文件并编辑

#进入gsl_gcc文件夹并新建makefile文件
$ touch makefile
# 编辑makefile文件
$ vim makefile
1
2
3
4
makefile文件内容(如果出现错误注意tab的缩进,gcc前要求一个tab的缩进,最好自己手敲一遍,直接粘贴可能出问题)

#注意:ccchenji是我系统的用户名,这里要换成你的系统的用户名。
IPATH=-I/home/ccchenji/Desktop/gsl_gcc/include
LPATH=-L/home/ccchenji/Desktop/gsl_gcc/lib
#这里直接链接的静态库文件
main:main.c
    gcc main.c $(IPATH)  $(LPATH) -l:libgsl.a -l:libgslcblas.a -o main

.PHONY:clean
clean:
    rm -rf main                       

3.新建main.c文件并编辑

#进入gsl_gcc文件夹并新建main.c文件
$ touch main.c
# 编辑makefile文件
$ vim main.c
1
2
3
4
main.c文件内容


#include <stdio.h>
#include <gsl/gsl_matrix.h>
int main (void)
{
        int i, j;
        gsl_matrix * m = gsl_matrix_alloc (10, 3);
        for (i = 0; i < 10; i++)
                for (j = 0; j < 3; j++)
                        gsl_matrix_set (m, i, j, 0.23 + 100*i + j);
        for (i = 0; i < 100; i++)
                for (j = 0; j < 3; j++)
                        printf ("m(%d,%d) = %g\n", i, j,
                                        gsl_matrix_get (m, i, j));
        gsl_matrix_free (m);
        return 0;
}


4.使用make命令编译main.c文件

$ make
#编译后生成main文件
#运行main文件
$ ./main
1
2
3
4
运行结果


GSL常用函数(持续更新)
矩阵运算
1.Matrix operations 详见手册8.4.9
/*
    This function adds the elements of matrix b to the elements of matrix a. 
     The result a(i, j) ← a(i, j) + b(i, j) is stored in a and b remains unchanged. 
     The two matrices must have the same dimensions.
*/
int gsl_matrix_add(gsl_matrix *a, const gsl_matrix *b)
/*
This function subtracts the elements of matrix b from the elements of matrix a. 
The result a(i, j) ← a(i, j) − b(i, j) is stored in a and b remains unchanged. 
The two matrices must have the same dimensions.
*/
int gsl_matrix_sub(gsl_matrix *a, const gsl_matrix *b)


2.矩阵乘法
要使用用gcc编译gsl_blas_dgemm 函数必须使用动态库,静态库链接会报错(交叉编译工具链默认使用静态库,对交叉编译工具链,可以使用静态库)

1.配置动态链接库路径

#编辑.bashrc文件
$ vim /home/ccchenji/.bashrc
#在文件末尾加入以下代码,以下代码的作用是将动态连接库加入到gcc默认搜索路径
export LD_LIBRARY_PATH=/home/ccchenji/Desktop/gsl_gcc/lib:$LD_LIBRARY_PATH
1
2
3
4
2.重写makefile文件

IPATH=-I/home/ccchenji/Desktop/gsl_gcc/include
LPATH=-L/home/ccchenji/Desktop/gsl_gcc/lib
#gcc 这里链接动态库
main:main.c
        gcc main.c $(IPATH)  $(LPATH) -lm -lgsl -lgslcblas -o main

.PHONY:clean
clean:
        rm -rf main                             

3.gsl_blas_dgemm()函数说明

//函数原型
int gsl_blas_dgemm( CBLAS_TRANSPOSE_t TransA, 
                    CBLAS_TRANSPOSE_t TransB, 
                    double alpha,
                    const gsl_matrix *A,
                    const gsl_matrix *B, 
                    double beta, 
                    gsl_matrix *C)
/*
参数说明
1.CBLAS_TRANSPOSE_t 可取值: 
  CblasNoTrans:矩阵不需要转置
  CblasTrans: 矩阵需要转置
2.alpha、beta数乘系数
3.计算表达式: C = alpha * op( A ) * op( B ) + beta * C
*/

4.gsl_blas_dgemm()函数使用例程

include <stdio.h>
#include <gsl/gsl_blas.h>
#include <math.h>
int main (void)
{
        double a[] = { 0.11, 0.12, 0.13,
                0.21, 0.22, 0.23 };
        double b[] = { 1011, 1012,
                1021, 1022,
                1031, 1032 };
        double c[] = { 0.00, 0.00,
                0.00, 0.00 };
        gsl_matrix_view A = gsl_matrix_view_array(a, 2, 3);
        gsl_matrix_view B = gsl_matrix_view_array(b, 3, 2);
        gsl_matrix_view C = gsl_matrix_view_array(c, 2, 2);
        /* Compute C = A B */
        gsl_blas_dgemm (CblasNoTrans, CblasNoTrans,
                        1.0, &A.matrix, &B.matrix,
                        0.0, &C.matrix);
        printf ("[ %g, %g\n", c[0], c[1]);
        printf (" %g, %g ]\n", c[2], c[3]);
        return 0;
}


2.矩阵求逆
示例代码

#include <stdio.h>
#include <gsl/gsl_linalg.h>

int main (void)
{
        double a_data[] = { 1.0, 0.6, 0.0,
                0.0, 1.5, 1.0,
                0.0, 1.0, 1.0 };
        /*
         * Inverse is
         *    1  -1.2   1.2
         *    0   2.0  -2.0
         *    0  -2.0   3.0
         */
        double inva[9];
        int s, i, j;

        gsl_matrix_view m
                = gsl_matrix_view_array(a_data, 3, 3);
        gsl_matrix_view inv
                = gsl_matrix_view_array(inva,3,3);
        gsl_permutation * p = gsl_permutation_alloc (3);

        printf("The matrix is\n");
        for (i = 0; i < 3; ++i)
                for (j = 0; j < 3; ++j)
                        printf(j==2?"%6.3f\n":"%6.3f ", gsl_matrix_get(&m.matrix,i,j));

        gsl_linalg_LU_decomp (&m.matrix, p, &s);    
        gsl_linalg_LU_invert (&m.matrix, p, &inv.matrix);

        printf("The inverse is\n");
        for (i = 0; i < 3; ++i)
                for (j = 0; j < 3; ++j)
                        printf(j==2?"%6.3f\n":"%6.3f ",gsl_matrix_get(&inv.matrix,i,j));
        gsl_permutation_free (p);
        return 0;
}


————————————————
版权声明:本文为CSDN博主「嵌入式魔法师」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_37649216/article/details/120233852

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值