logo.gif (2519 bytes)

计算机应用
Computer Applications
1999年 第19卷 第7期 Vol.19 No.7 1999

qklogo.gif (1030 bytes)

关于Mathematica系统通讯机制MathLink的研究

吕 民 蔡经球


  摘 要 使用MathLink通讯机制可以扩展Mathematica系统的功能。本文介绍了MathLink通讯的基本方式和方法,设计、实现了一个用Visual Basic编写的“同Mathematica 内核通讯”的ActiveX控件并给出一个使用该控件的例子。
  关键词 Mathematica,MathLink,通讯机制,ActiveX控件
  

RESEARCH ON MATHLINK: THE MECHANISM OF
COMMUNICATION IN MATHEMATICA SYSTEM


Lü Min
 Cai Jingqiu
Computer Science Department, Xiamen University, Fujian*Xiamen 361005


  Abstract To use MathLink can expand the capability of Mathematica system. Here introduced the methods of using MathLink and designed an ActiveX control to communicate with Mathematica kernel.
  Keywords Mathematica, MathLink, Communication, ActiveX control

1 研究的必要性

  Mathematica系统是一个近十年来国外开发出来的功能强大、性能优异的计算机数学系统软件。主要功能包括符号演算、数值计算和图形三个方面。用户采用该系统提供的程序设计语言能够编写各种功能的函数。Mathematica系统主要分为Front End(前端)和Kernel(内核)两个部分。前端是用户与系统内核交互的界面,同时可作为编辑器,提供格式化输入。内核是系统实际进行计算的部分,并把计算结果返回给前端。
  我们在研究、使用Mathematica系统时,深感该系统功能之强大,同时也认识到其标准界面的某些不便之处以及其他一些问题,如:数据输入界面不直观;图形输出不易作特殊处理;已开发好的扩充程序包不具备标准的Window风格,只能在其标准前端中调用执行;对现存的一些程序不能充分共享资源,尤其在利用数据库的数据时更是如此。为此,我们深入研究了Mathematica系统内建的通讯机制MathLink。

2 Mathematica的通讯机制MathLink

  Mathematica系统的强大及易扩展性不仅体现在可以使用其语言开发各种功能的函数,同时也体现在它同其他程序的通讯能力和同流行编程语言的接口上。它内建的通讯机制─MathLink提供了外部程序与Mathematica系统通讯的一般接口。所谓的MathLink,就是在程序之间交换Mathematica表达式的机制。为了使用MathLink,在外部程序中应该包括一部分MathLink接口库的代码。
  下面,我们简单介绍在MathLink中所使用的表达式:
2.1 MathLink传输的表达式
  MathLink既可以同外部程序交换通用的数据类型,也可以传输Mathematica特有的表达式。它与C语言的通用数据类型的对照表如下:  

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[Parameter1Integer,
  Parameter2Integer]
  :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语言实现的通讯控件
  鉴于编制MathLink通讯程序的复杂性,为了尽可能利用Mathematica系统的强大能力,我们使用MathLink提供的API,用Visual Basic语言实现了“同Mathematica 内核通讯的ActiveX控件”。该控件目前的主要功能是:同Mathematica内核建立连接,然后发送一个表达式给内核进行计算并得到结果。
  该ActiveX控件的属性有:

  MathKernelPath: 存放Mathematica系统内核文件MathKernel.exe的路径。
  PictureOutput: 当有图形输出时,存放以Postscript语言表达的图形描述。
  Output: 存放Print[]语句和其他非系统提示性输出的结果。
  MessageOutput: 存放系统提示性输出的结果。
  ConnectFlag: 标志与系统内核连接是否成功。
  ErrorFlag: 标志是否出错。
  该控件的方法:
  Connect: 该方法依照属性MathKernelPath与Mathematica内核建立连接。
  Disconnect: 关闭已建立的连接。
  Evaluate: 给内核发送表达式进行计算。
  该控件的事件:
  OutputEvent: 当内核有Print[]语句输出或其他非系统提示性输出时,触发该事件。
  PictureOutputEvent: 当内核有图形输出时,触发该事件。
  MessageOutputEvent: 当内核有系统提示性输出时,触发该事件。
  在可使用ActiveX控件的流行程序开发工具中使用该控件,诸如:Visual C++、Visual Basic、Delphi等,可以方便、快速地解决大多数调用Mathematica内核的需求。以下是一个使用该控件的实例。 

47-2.gif (5726 bytes)

在该例中,我们想用遗传算法实现对一个数据库信息的数据挖掘,计算部分是用Mathematica语言编制的,数据的获取是用ODBC从SQL上取得,程序采用Visual Basic语言,整个过程如上图所示。
  其中,ActiveX控件对象是我们编制的通讯控件的实例化,它把已经编成Mathematica表达式的数据传递给Mathematica内核,并把得到的结果送给处理计算结果的子模块,整个程序实现了我们的想法。

  吕 民 硕士研究生。研究方向:专家系统、遗传算法、数据挖掘。
  蔡经球 教授。研究方向:专家系统、不精确推理、知识表示、程序变换等。
  作者单位:吕 民 蔡经球(厦门大学计算机系 福建厦门 361005)

参考文献

1] Todd Gayley. A MathLink TutorialWolfram Research
Inc..http://www.mathsource.com/Content/Enhancements/MathLink/0206-693
2] Stephen Wolfram.The Mathematica BookThird Edition.
Wolfram Research Inc.
1996
3] 裘宗燕. Mathematica数学软件系统的应用及其程序设计. 北京: 北京大学出版社,1994

posted on 2012-11-14 10:28  seventhsaint  阅读(515)  评论(0编辑  收藏  举报