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 ...
随机推荐
- Andriod开发技巧——Fragment的懒载入
我们在做应用开发的时候.一个Activity里面可能会以viewpager(或其它容器)与多个Fragment来组合使用.而假设每一个fragment都须要去载入数据.或从本地载入.或从网络载入,那么 ...
- 查看及更改MySQL数据库物理文件存放的位置
查看命令: mysql> show global variables like "%datadir%"; 表格第二行即为文件的位置.另外,可以在该文件夹的配置文件my.i ...
- js阻碍DOM加载
今天用谷歌做了个小测试 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...
- poj3254Corn Fields
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 13765 Accepted: 7232 Desc ...
- How to: Specify the Web Server for Web Projects in Visual Studio
https://msdn.microsoft.com/en-us/library/ms178108(v=vs.120).aspx When you run a Web project in Visua ...
- 46. Ext中namespace的作用(转)
转自:https://www.cnblogs.com/givemeanorange/p/5569954.html Ext中在每一个页面中添加一个namespace呢,就像下面的代码: // creat ...
- MySQL 1366错误解决办法
MySQL 1366错误大致描述如下 SQL Error: 1366: Incorrect string value: "xE8xAFxA6xE7xBBx86-" for colu ...
- Nginx网站用Let’sEncrypt证书开HTTPS
- ACM_迟到的祝福(四)
迟到的祝福(四) Time Limit: 2000/1000ms (Java/Others) Problem Description: 据说前几天是雁来师姐的生日,作为一个15级的小鲜肉A,没及时给师 ...
- ACM_小Z的A+B
小Z的A+B Time Limit: 2000/1000ms (Java/Others) Problem Description: 小Z最喜欢A+B了,没事就研究研究,比如什么大整数A+B(就是100 ...