Origin C调用GSL
GSL (GNU Scientific Library, http://www.gnu.org/software/gsl/)是C、C++的数值算法库,提供了范围宽广的数学程序,包括随机数字生成器、数理方程与特殊函数、最小二乘法拟合等。最重要的是GSL是基于GNU General Public License的,可以免费使用。
Origin C中调用GSL,要用到两个dll,libgsl.dll和libgslcblas.dll。为了简单起见,直接用现成的dll,可以从http://gnuwin32.sourceforge.net/packages/gsl.htm下载。找到网页上Download的Binaries,下载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的更多相关文章
- Origin C调用NAG库
NAG(Numerical Algorithms Group, www.nag.com)库是一个无与伦比的算法库,它提供的算法可靠.轻便.严谨,覆盖了数学与统计方方面面.最大的缺点就是:它是一个收费的 ...
- Windows10 + Matlab2013 mex C++ 调用gsl
最前面啰嗦一句,matlab默认编译c的编译器有点奇怪,会出现引用.h却找不到相应函数的问题,解决方法是把.c全部都改成.cpp!血的教训! 下面进入正题~~ 由于Matlab调用的C函数中引用了GS ...
- VC++编译GSL
目录 第1章 VC++ 1 1.1 修改行结束符 1 1.2 修改#include "*.c" 为 #include "*.inl" 2 1. ...
- git版本控制的笔记
一.配置你的身份,提交代码时git就可以知道是谁提交的了 git config --global user.name "Tony" git config --global user ...
- js,jquery备忘录
1.var s = str.charCodeAt();转ASCII码 2.String.fromCharCode(65);转字母 3.es6 ... (扩展运算符),将一个数组转化成由逗号分割的队列. ...
- Typescript学习笔记(四)class 类
typescript的类,与c#,java等语言的类类似.也是包含了一大部分的es6的实现.我会用最通俗的语言讲一下对coding有用的地方. class Greeter { greeting: st ...
- JavaScript深度克隆(递归)
今天在深度理解JQuery源码时,剖析extend时: jQuery.extend = jQuery.fn.extend = function() { //... } 感觉该方法的一部分功能与深度克隆 ...
- postMessage 消息传递
点击查看demo 前言 web开发了,除了前台与服务器交换数据,还有可能前台页面间需要进行数据传递,比如窗口间,页面和嵌套的iframe间.这些问题之前都有解决办法,但是现在html5引入的messa ...
- 跨域通信--Window.postMessage()
一.跨源通信概述 源:协议.端口号(https默认值433).主机域名(document.domain) 作用:向目标窗口派发MessageEvent消息(四个属性) 兼容参考 MessageEven ...
随机推荐
- Vim tips——Working with external commands
A common sequence of events when editing files is to make a change and then need to test by executin ...
- UVA 10555 - Dead Fraction(数论+无限循环小数)
UVA 10555 - Dead Fraction 题目链接 题意:给定一个循环小数,不确定循环节,求出该小数用分数表示,而且分母最小的情况 思路:推个小公式 一个小数0.aaaaabbb... 表示 ...
- js字符转处理
那几个函数的应用: <script> //全局变量删不掉,而全局属性能删掉 var a=123; function aa () { b=321; delete b; } aa(); del ...
- LeetCode241——Different Ways to Add Parentheses
Given a string of numbers and operators, return all possible results from computing all the differen ...
- What is a good buffer size for socket programming?
http://stackoverflow.com/questions/2811006/what-is-a-good-buffer-size-for-socket-programming 问题: We ...
- unpe13e 学习备忘1
转其他地方. http://blog.sina.com.cn/s/blog_a43aba560101a2s5.html 运行书本中的程序.1,首先,下载源码:unpv13e.tar.gz2,然后,编 ...
- 【HDU 4699】 Editor
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=4699 [算法] 维护两个栈,一个栈放光标之前的数,另外一个放光标之后的数 在维护栈的同时求最大前缀 ...
- atoi函数——将字符串转换为整数
atoi在一个叫<cstdlib>的库里,可以把字符串直接转换为整数,贼强势. 还有一个atof,就是换成浮点数,实质上是一样的. 例子: #include<cstdlib> ...
- nova service-list for juno kilo,liberty openstack
- PCB MS SQL 存储过程(CLR) 实现Json转DataTable表的方法
一.准备需转为DataTable的json字符串 原json字符串数据 [{"TechName":"ECN","TechNo":" ...