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 ...
随机推荐
- IIS: 配置web.config解决Maximum request length exceeded错误
In system.web <httpRuntime maxRequestLength="1048576" executionTimeout="3600" ...
- [Vue-rx] Pass Template Data Through domStreams in Vue.js and RxJS
domStreams enable you to pass additional data along the stream that can be provided by the template ...
- 违章查询免费api接口代码
能够依据城市+车牌号+发动机号查询违章信息列表. 违章实体类 package org.wx.xhelper.model; /** * 违章实体类 * @author wangxw * @version ...
- android微信开放平台,申请移动应用的应用签名怎样获取
在微信开放平台,申请移动应用的时候: https://open.weixin.qq.com/cgi-bin/appcreate? t=manage/createMobile&type=app& ...
- Java基础:初始化和清理
转载请注明出处:jiq•钦's technical Blog (1) 初始化: 所以假设继承关系为:A导出B再导出C,在创建C对象的情况下的调用顺序是: * (1) A的静态域,B的静态域,C的静态域 ...
- LeetCode 203. Remove Linked List Elements (移除链表中的项)
Remove all elements from a linked list of integers that have value val. ExampleGiven: 1 --> 2 --& ...
- Pell Sequence
/* * PellSequence.cpp * * Created on: 2013-09-08 16:46 * Author: lg * Description: a1 = 1, a2 = 2, . ...
- NYOJ 330 一个简单的数学题【数学题】
/* 题目大意:求解1/n; 解题思路:写一个输出小数的算法 关键点:怎样处理小数点循环输出 解题人:lingnichong 解题时间:2014-10-18 09:04:22 解题体会:输出小数的算法 ...
- 为什么使用 use strict
进入标志: "use script"; 使用方式: 可以在 js 代码的第一行,也可以使用在函数中.但是写在 js 代码第一行不利于文件合并,因此可以写在一个自调用函数的第一行 使 ...
- JS高级技巧学习小结
安全类型检測 var isArray = value instanceof Array; 以上代码要返回true,value必须是一个数组,并且还必须与Array构造函数在同一个全局作用域中(Arra ...