计算机应用 |
||
|
关于Mathematica系统通讯机制MathLink的研究 吕 民 蔡经球
RESEARCH ON MATHLINK: THE MECHANISM OF
|
Mathematica定义类型 | 说明 | C定义类型 |
Integer | 整 型 | Integer |
Real | 浮点型 | Double |
String | 字符串 | Char * |
Symbol | 符号名 | Char * |
另外,在Mathematica系统处理的表达式中,表是一类最典型的表达式,它把一些表达式聚集起来构成一个整体,例如:向量、矩阵、集合等。MathLink也可以在外部程序和Mathematica之间交换表结构。下面是四种典型的表结构与C语言相应的数据结构的对照: |
Mathematica定义类型 | 说明 | C定义结构 |
IntegerList | 整型的一维数组(表) | Int * ,Long |
RealList | 浮点型的一维数组(表) | Double *,Long |
IntegerArray | 整型的数组(表) | Int *,Long *,Long |
RealArray | 浮点型的数组(表) | Real *,Long *,Long |
MathLink可以把数组(也就是表)一次性传递给外部程序,在C语言中定义相应的指针接收它。对于一维数组,使用接收数组维数的常整型变量;对于多维数组,使用接收各维大小的长整型指针和维数的常整型变量。 对于C语言中的单、双精度的浮点型以及短、长、无符号的整型类型,由于Mathematica系统可以用任意精度表示数值,因此,在MathLink中只是在必要的时候作精度截取。 2.2 MathLink通讯的基本方式和方法 MathLink的典型使用如下: 1) 在Mathematica中调用外部程序的函数; 2) 在外部程序中调用Mathematica内核; 3) 更换Mathematica的可选择的前端; 4) 在Mathematica与外部程序之间交换数据; 5) 在Mathematica的并发事件之间交换数据。 在以上几种使用方式中,第1)、2)项是第4)项的功能细化;第2)、3)项也是等价的,因为Mathematica系统的标准前端也是通过MathLink机制同内核交互的,因此,我们可把Mathematica的标准前端也看作是一个区别于内核的“外部”程序。下面,我们主要谈谈实现第1)、2)和5)项的方法。 在Mathematica中,使用安装(Install)方式,可以调用定义在外部程序中的函数。通过安装机制,外部函数同Mathematica环境完整地结合在一起。 首先,创建一个模板文件。在该文件中,定义了外部函数的名字、需传递的参数以及它们的类型和返回值的类型。典型模板文件格式如下: :Begin: :Function: ExternalFunction :Pattern:ExternalFunction[Parameter1—Integer, Parameter2—Integer] :Arguments:{Parameter1,Parameter2} :ArgumentTypes:{Integer,Integer} :ReturnType:Integer :End: 在该模板文件中,:Begin:和:End:分别标志文件的起止;:Function:行定义C函数的名字;:Pattern:行定义该函数在Mathematica中被调用的形式;:Arguments:、:ArgumentTypes:和:ReturnType:分别定义传递的形式参数、它们的类型以及返回值的类型。 定义好模板文件后,用C语言写出ExternalFunction函数的定义。然后用Win32版的Mathematica系统所附带的代码生成工具mprep把它们同MathLink代码连接起来,生成C代码的可编译文件。在C语言编译器中生成可执行文件即可。 在Mathematica系统中,使用Install[“ExternalFunctionFileName”]函数安装外部程序后,就可以象系统自身的函数调用一样执行外部函数了。(具体步骤参见参考文献[1])。 同调用可安装式的外部函数相比,在自己的程序中利用Mathematica系统内核在数值计算方面的强大功能显得更为重要。但是,编写这样的程序也比较困难,因为系统没有提供类似mpreg的工具,自己要处理全部的MathLink代码。 在Mathlink中用到了包(Packet)的概念。MathLink的包是一个函数,它指示传输数据的类型信息。MathLink传递的数据实际上都包含在这样的包中。 在C语言中,要同Mathematica内核建立连接,应先调用接口函数MLInitialize()作环境初始化,再调用MLOpen()建立MathLink连接。接下来,就可以使用MathLink库函数进行必要的数据交换了。应该指出的是,对于内核返回的任何数据都应先分析其包的信息,以便正确处理包内的内容。处理完毕,调用MLClose()取消内核连接,并用MLDeinitialize()注销环境。(具体步骤参见参考文献[1])。 MathLink不仅可以在Mathematica系统与外部程序间进行数据通讯,还可以在Mathematica系统的多个事件之间交换数据。这种方式称为MathLink的Internet连接方式。使用Internet连接方式,我们可以使因特网上的多台运行Mathematica的工作站共同完成某项工作。这样,Mathematica系统就成为一个带有分布式计算性质的计算环境。 该功能主要由以下几个接口函数实现: LinkCreate[]: 创建一个连接; LinkConnect[]: 关联到一个已有的连接; LinkClose[]: 关闭连接; LinkWrite[]: 向连接写表达式; LinkRead[]: 从连接中读取表达式。 MathLink设置协作的Mathematica任务时,一般采用的是TCP协议。 3 用VB语言实现的通讯控件 |
MathKernelPath: 存放Mathematica系统内核文件MathKernel.exe的路径。 |
在该例中,我们想用遗传算法实现对一个数据库信息的数据挖掘,计算部分是用Mathematica语言编制的,数据的获取是用ODBC从SQL上取得,程序采用Visual Basic语言,整个过程如上图所示。 其中,ActiveX控件对象是我们编制的通讯控件的实例化,它把已经编成Mathematica表达式的数据传递给Mathematica内核,并把得到的结果送给处理计算结果的子模块,整个程序实现了我们的想法。 吕 民 硕士研究生。研究方向:专家系统、遗传算法、数据挖掘。 参考文献 [1] Todd Gayley. A MathLink Tutorial,Wolfram Research |