GSL (GNU Scientific Library, http://www.gnu.org/software/gsl/)是C、C++的数值算法库,提供了范围宽广的数学程序,包括随机数字生成器、数理方程与特殊函数、最小二乘法拟合等。最重要的是GSL是基于GNU General Public License的,可以免费使用。

Origin C中调用GSL,要用到两个dlllibgsl.dlllibgslcblas.dll。为了简单起见,直接用现成的dll,可以从http://gnuwin32.sourceforge.net/packages/gsl.htm下载。找到网页上DownloadBinaries,下载Zip,解压后在bin文件夹可以找到对应的两个dll。注意这两个dll对应的GSL版本是1.8,而且是32位的,要用更高版本或64位版本,需要自行编译

这里演示的是调用GSL的线性拟合的函数,这个函数的原型如下:

int gsl_fit_linear(const double * x, const size_t xstride, const double * y, const size_t ystride, size_t n, double * c0, double * c1, double * cov00, double * cov01, double * cov11, double * sumsq)

关于这个函数的说明,可以参考GSL关于线性回归的文档http://www.gnu.org/software/gsl/doc/html/lls.html#linear-regression-with-a-constant-term

1.打开Origin所在的User Files Folder,然后找到OriginC这个文件夹(如果没有,新建一个),在这个文件夹下新建一个文件夹,命名为Origin_Call_GSL,这个名字可以是任命合法的名字,不一定是这个名字。

2.把两个dll解压到Origin_Call_GSL文件夹里。

3.在Origin(需要32位的Origin)的Code Builder新建一个头文件,名字可以为Origin_Call_GSL.h,保存到Origin_Call_GSL文件夹。在这个头文件里,主要的包括两部分:载入dll和GSL函数的原型说明。

/*
pragma指令是告诉Origin C到哪去链接函数体,
header的意思就是在与头文件相同的文件夹里
*/
#pragma dll(libgsl, header)
/*
声明GSL函数原型
可以直接从GSL头文件复制过来
此函数文档:
http://www.gnu.org/software/gsl/doc/html/lls.html#linear-regression-with-a-constant-term
*/
GSL_EXPORT int gsl_fit_linear(const double * x, const size_t xstride, const double * y, const size_t ystride, size_t n, double * c0, double * c1, double * cov00, double * cov01, double * cov11, double * sumsq);

4.然后新建一个c文件,名为Origin_Call_GSL.c,保存在与头文件一个文件夹上,并加入Code Builder的工作空间中。

第一步当然是要把头文件引进来。

#include "Origin_Call_GSL.h"  // 引入头文件

第二步就可以新建一个Origin C函数来调用头文件里声明的GSL函数了。

void Origin_Call_GSL() {  // 定义一个Origin C函数,编译通过可以直接在Origin的Script Window直接运行
size_t n;
double *x, *y;
size_t xstride, ystride;
double c0, c1, cov00, cov01, cov11, sumsq; // 准备数据
n = 8;
xstride = 1;
ystride = 1;
x = (double *)malloc(sizeof(double) * n);
y = (double *)malloc(sizeof(double) * n);
x[0] = 1.0;
x[1] = 0.0;
x[2] = 4.0;
x[3] = 7.5;
x[4] = 2.5;
x[5] = 0.0;
x[6] = 10.0;
x[7] = 5.0;
y[0] = 20.0;
y[1] = 15.5;
y[2] = 28.3;
y[3] = 45.0;
y[4] = 24.5;
y[5] = 10.0;
y[6] = 99.0;
y[7] = 31.2; // 调用GSL函数
gsl_fit_linear(x, 1, y, 1, n, &c0, &c1, &cov00, &cov01, &cov11, &sumsq);
printf("\n回归常数项(截距) c0 = %6.4f\n", c0);
printf("回归系数(斜率) c1 = %6.4f\n", c1);
printf("方差与协方差矩阵 cov00 = %6.4f cov01 = %6.4f cov11 = %6.4f\n", cov00, cov01, cov11);
printf("残差平方和 sumsq = %6.4f\n", sumsq); free(x);
free(y);
}

注意事项:

1.要同时支持32位和64位,除了要同时提供32位和64位的dll外,在加载dll的代码也有讲究。

#ifdef _OWIN64  // 这个宏是判断当前Origin是不是64位的
#pragma dll(libgsl_64, header) // 假如64位的dll叫libgsl_64
#else
#pragma dll(libgsl, header)
#endif // _OWIN64

2.如果要调用的GSL函数返回值的类型是结构体的,对不起,Origin C不支持使用这类函数。

源码可于github下载:https://github.com/gkimeeq/OriginAdvancedApplication

Origin C调用GSL的更多相关文章

  1. Origin C调用NAG库

    NAG(Numerical Algorithms Group, www.nag.com)库是一个无与伦比的算法库,它提供的算法可靠.轻便.严谨,覆盖了数学与统计方方面面.最大的缺点就是:它是一个收费的 ...

  2. Windows10 + Matlab2013 mex C++ 调用gsl

    最前面啰嗦一句,matlab默认编译c的编译器有点奇怪,会出现引用.h却找不到相应函数的问题,解决方法是把.c全部都改成.cpp!血的教训! 下面进入正题~~ 由于Matlab调用的C函数中引用了GS ...

  3. VC++编译GSL

    目录 第1章 VC++    1 1.1 修改行结束符    1 1.2 修改#include "*.c" 为 #include "*.inl"    2 1. ...

  4. git版本控制的笔记

    一.配置你的身份,提交代码时git就可以知道是谁提交的了 git config --global user.name "Tony" git config --global user ...

  5. js,jquery备忘录

    1.var s = str.charCodeAt();转ASCII码 2.String.fromCharCode(65);转字母 3.es6 ... (扩展运算符),将一个数组转化成由逗号分割的队列. ...

  6. Typescript学习笔记(四)class 类

    typescript的类,与c#,java等语言的类类似.也是包含了一大部分的es6的实现.我会用最通俗的语言讲一下对coding有用的地方. class Greeter { greeting: st ...

  7. JavaScript深度克隆(递归)

    今天在深度理解JQuery源码时,剖析extend时: jQuery.extend = jQuery.fn.extend = function() { //... } 感觉该方法的一部分功能与深度克隆 ...

  8. postMessage 消息传递

    点击查看demo 前言 web开发了,除了前台与服务器交换数据,还有可能前台页面间需要进行数据传递,比如窗口间,页面和嵌套的iframe间.这些问题之前都有解决办法,但是现在html5引入的messa ...

  9. 跨域通信--Window.postMessage()

    一.跨源通信概述 源:协议.端口号(https默认值433).主机域名(document.domain) 作用:向目标窗口派发MessageEvent消息(四个属性) 兼容参考 MessageEven ...

随机推荐

  1. word分节时,如何让每一节的首页置为奇数页

    具体操作,可参考如下图片所示的步骤: 打印时的效果: 备注:目录页为第二小节首页(文档的第二页),整个文档的首页为封面第一页. 打印时,会在首页后自动插入一张空白页:也会在正文(第三页,第三节)前,目 ...

  2. 【CV论文阅读】:Rich feature hierarchies for accurate object detection and semantic segmentation

    R-CNN总结 不总结就没有积累 R-CNN的全称是 Regions with CNN features.它的主要基础是经典的AlexNet,使用AlexNet来提取每个region特征,而不再是传统 ...

  3. HDU 3008 DP

    基础DP题 打BOSS  BOSS和自己都有100点血.玩家先手 每回合能够选择施放技能攻击(耗蓝,共n种)或者普通攻击(不耗蓝,伤害为1),BOSS每回合会攻击自己q点血,每回合自己会恢复t点法力 ...

  4. 一次c3p0连接池连接异常错误的排查

    近期写了一个数据库採集程序,大概过程是将SQLSERVER数据库的数据定时採集到Oracle数据库. 1小时出一次数据,每次数据量在2W左右.环境採用Sping3+hibernate4,数据库连接池採 ...

  5. BestCoder Round #59 (div.2) B. Reorder the Books 想法题

    Reorder the Books 问题描述 dxy家收藏了一套书,这套书叫<SDOI故事集>,<SDOI故事集>有n(n\leq 19)n(n≤19)本,每本书有一个编号,从 ...

  6. java多线程——饥饿和公平

    一.概念 饥饿:如果一个线程因为 CPU 时间全部被其他线程抢走而得不到 CPU 运行时间,这种状态被称之为“饥饿”: 二.饥饿原因 高优先级线程吞噬所有的低优先级线程的 CPU 时间. 线程被永久堵 ...

  7. 分析智能卡的ATR格式【转】

    本文转载自:http://blog.csdn.net/michaelcao1980/article/details/8215135 一些例子 NXP 080=========3b f8 T0 Y1 = ...

  8. Android之利用EventBus进行消息传递

    什么是EventBus EventBus是一个 发布/订阅 模式的消息总线库,它简化了应用程序内各组件间.组件与后台线程间的通信,解耦了事件的发送者和接收者,避免了复杂的.易于出错的依赖及生命周期问题 ...

  9. git ldap

    https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/README.md ldap : enabled : true host : 'ope ...

  10. tyvj2054 四叶草魔杖——连通块 & 状压DP

    题目:http://www.joyoi.cn/problem/tyvj-2054 把点分成几个连通块,和为0的几个点放在一块,在块内跑最小生成树作为这个块的代价: 然后状压DP,组成全集的最小代价就是 ...