如何利用Mathematica调用C编写的函数

[使用范围]Windows XP SP2; Mathematica 6.0; 传递变量类型简单的函数
[方法]

1.用C语言写好函数,如
double f(double x,double y){
return x*y;
}

2.找到路径C:\Program Files\Wolfram Research\Mathematica\6.0

\SystemFiles\Links\MathLink\DeveloperKit\Windows\MathLinkExamples\addtwo或相应安装目录下的addtwo.c以及

addtwo.tm两个文件拷贝到某个自己的文件夹中。此二为Mathematica为MathLink Program所写的例子

3.将addtwo.c以及addtwo.tm依照用C语言写好的函数进行修改存为f.c以及f.tm,其中本例需要修改之处
(1)addtwo.c中"extern int addtwo( int i, int j);"及以下函数addtwo代码部分替换为函数f相应的代码。
(2)addtwo.tm中Function、Pattern、Arguments、ArgumentTypes、ReturnType均需要按照f的定义进行修改,其中

addtwo两个变量均是int返回值也是int而f的变量和返回值均为double,故应当将其中Integer相应改为Real
(3)如果需要用户能在Mathematica中通过?+函数名来查询函数功能,则需修改:Evaluate:项中相应的内容

特别注意(至少)若安装有Visual Studio 6则不可按文档

Tutorial/SettingUpExternalFunctionsToBeCalledFromMathematica中所述的方法自行编写f.c,那样会导致LINK时提

示WinMain函数无定义

4.安装负责将MathLink template文件生成C代码的mprep.exe,做法如下
(1)进入C:\Program Files\Wolfram Research\Mathematica\6.0

\SystemFiles\Links\MathLink\DeveloperKit\Windows\CompilerAdditions\MLDev32或非默认安装位置的相应文件夹
(2)按下Ctrl键,选中并拖拽Lib,Include,Bin三个文件夹进入路径C:\Program Files\Microsoft Visual Studio\VC98

(Visual Studio 6)或C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK(Visual Studio 2005)或任何非

默认安装路径相应文件夹下
(3)出现提示对话框时选择"是"或"全部"
此操作会将Mathematica的三个文件夹中的文件复制到VC同名文件夹下

4.完成后进入命令行并进入存储f.c以及f.tm的文件夹,输入如下语句
SET CL=/nologo /c /DWIN32 /D_WINDOWS /W3 /O2 /DNDEBUG
SET LINK=/NOLOGO /SUBSYSTEM:windows /INCREMENTAL:no /PDB:NONE kernel32.lib user32.lib gdi32.lib
MPREP f.tm -o ftm.c
CL f.c ftm.c
LINK f.obj ftm.obj ml32i3m.lib /OUT:f.exe
此操作最终将会编译出可被Mathematica调用的MathLink程序f.exe
其中前两句将(创建及)改变环境变量CL,LINK的值,其选项的意义详见Mathematica文档

tutorial/MathLinkDeveloperGuide-Windows
mprep句执行后应生成ftm.c,-o意为输出成文件,CL句执行后将生成f.obj以及ftm.obj,LINK句将生成f.exe,其中

ml32i3m.lib为MathLink所需的库文件,应当位于编译器所能找到的路径中

5.在Mathematica中安装并调用程序。可用如下语句调入程序
link=Install["[路径]\\f"]
其中[路径]应用f.exe所在路径代替。卸载程序时只需用语句
Uninstall[link]
即可。注意调用时涉及精确值时(如1而非1.)f函数可能不能给出数值,只需再用N[]即可得出。

参考文献:
Mathematica文档中心tutorial/MathLinkAndExternalProgramCommunicationOverview
tutorial/MathLinkDeveloperGuide-Windows

源地址:http://blog.xiaonei.com/GetEntry.do?id=268674028&owner=98963208  

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