我有兴趣在Mathematica会话中调用fortran代码.我了解到Mathlink提供了一种方法.但我对C语言知之甚少,对C++没什么了解.有人愿意给我一个详细的例子吗?
我正在使用Mathematica 8,MS Visual Studio 2008和Intel Fortran 11.该系统是Windows 7 Home Premium.
非常感谢!
我刚刚发现这样的MathLink函数,LinkWrite并且LinkRead具有类似于它自己的内部的东西CheckAbort,可以吸收任何中止,并且不会进一步传播它们.
这可以很容易地显示LinkRead:
link = LinkLaunch[First[$CommandLine] <> " -mathlink"];
LinkRead[link];
LinkWrite[link, Unevaluated[Pause[10]]];
{LinkRead[link], Print["!!"]}
Run Code Online (Sandbox Code Playgroud)
在评估上面的代码后按Alt+ .,您将得到以下输出:
During evaluation of In[6]:= !!
Out[9]= {ReturnPacket[$Aborted], Null}
Run Code Online (Sandbox Code Playgroud)
如你所见,中止被吸收了LinkRead.
我的问题是它打破了我自己的评估流量控制CheckAbort.
有没有办法拦截将中止这种功能被吸收LinkRead和LinkWrite?
我想知道如何从Python调用Mathematica函数.
我很欣赏一个例子,例如,使用Mathematica函数Prime.
我搜索过MathLink但是如何在Python中使用它对我来说有点模糊.
我试图使用一个名为pyml的Mathematica-Python库,但我没有成功,也许是因为这个lib看起来很旧(在教程中说Mathematica 2或3).
尝试编译源代码Wolfram/Mathematica/8.0/SystemFiles/Links/Python但在使用python 2.6时出现了几个错误(文档说只应该对python 2.3起作用).
Pythonika很有趣,但看起来只是在Mathematica笔记本中使用,我想编写.py调用Mathematica函数的文件.
那么,有人知道编写使用Mathematica函数的python程序的好方法并且可以给我一个例子吗?
我在同一台机器上安装了Mathematica 7.01和Mathematica 5.2.我希望能够在Mathematica 7.01会话中评估v.5.2内核中的代码.我的意思是运行Mathematica 7.0.1标准会话我希望有一个命令,比如kernel5Evaluate评估5.2内核中的一些代码,并将结果返回到7.01内核并链接7.01 FrontEnd笔记本,这样代码将在7.01内核.
例如(在标准的Mathematica v.7.01会话中):
In[1]:= solutionFrom5 = kernel5Evaluate[NDSolve[{(y^\[Prime])[x]==y[x],y[1]==2},y,{x,0,3}]]
Out[1]= {{y -> InterpolatingFunction[{{0., 3.}}, <>]}}
In[2]:= kernel5Evaluate[Plot3D[Sin[x y],{x,-Pi,Pi},{y,-Pi,Pi}]]
During evaluation of In[2]:= GraphicsData["PostScript", "\<\............
Out[2]= -SurfaceGraphics-
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,结果应该好像v.5.2内核在v.7.01 FrontEnd中设置为"Notebook's Kernel".当然solutionFrom5变量应该设置为v.5.2内核返回的实际解决方案.
我想我开始理解如何将用C/C++编写的函数链接到Mathematica.我面临的问题是我不知道如何从我的C包装器向Mathematica发送错误消息.在谷歌搜索后,我找到了这个MathLink教程.
第1.7节给了我一个关于如何发送错误消息的见解,但我得到了奇怪的结果.这是我正在使用的代码.
//File cppFunctions.h
#ifndef CPPFUNCTIONS_H
#define CPPFUNCTIONS_H
class Point {
public:
double x, y;
Point(){ x=y=0.0;}
Point(double a, double b): x(a), y(b) {}
};
class Line {
public:
Point p1, p2;
Line(void) {}
Line(const Point &P, const Point &Q): p1(P), p2(Q) {}
double distanceTo(const Line &M, const double &EPS = 0.000001){
double x21 = p2.x - p1.x; double y21 = p2.y - p1.y;
double x43 = M.p2.x - M.p1.x; double y43 = M.p2.y - M.p1.y; …Run Code Online (Sandbox Code Playgroud) 我之前有一个关于将Mathematica与用C++编写的函数集成的问题.
这是一个后续问题:
如果计算时间过长,我希望能够使用评估>中止评估中止它.答案中建议的哪些技术可以实现可中断的基于C的扩展功能?如何在C端实施"可中断性"?
我需要以一种既不会破坏它,也不会损坏Mathematica内核的方式使我的函数可中断(即应该可以在Mathematica被中断后再次调用该函数)
编辑:只是确认你是否可以重现这个是否有用.尝试此操作只需要一台计算机(无需远程连接).
更新似乎其他人无法在Mac或Win7上重现这一点,因此它可能是WinXP特定的或特定于我的机器.在这一点上,我放弃了.
最好有一个关于前端和内核如何通信的教程,这样我们就可以调试远程内核问题.任何这样的一般答案(或其他地方的教程链接)都是最受欢迎的.我已经了解Sascha Kratky 的远程内核策略.
现在的实际问题是: 当我以任何方式连接到远程机器时(例如使用远程内核策略),前端迟早会冻结.我怎么能阻止这个?
以下是如何在一台机器上重现问题(无需远程连接):
创建新的内核配置(评估菜单 - >内核配置选项...)
选择高级选项.
MLOpen的论据:
-LinkName "8000@YOUR-IP-HERE,8001@YOUR-IP-HERE" -LinkMode Listen
-LinkProtocol TCPIP -LinkHost "YOUR-IP-HERE" -LinkOptions MLDontInteract
Run Code Online (Sandbox Code Playgroud)
(替换YOUR-IP-HERE为计算机的IP地址.在Windows上,您可以通过ipconfig在命令窗口中输入来获取此信息.)
用于启动内核的Shell命令:保留为空(我们将手动执行)
打开一个新的笔记本,将笔记本的内核设置为你刚设置的内核,并评估一些东西(1+1).
现在我们需要在连接超时之前手动启动内核.因此,math在命令行模式下启动一个新的kernel(),并评估以下内容:
link=LinkConnect["8000,8001",LinkProtocol->"TCPIP"] (* connect to front end link *)
$ParentLink = link; (* set the front end link as parent link *)
Run Code Online (Sandbox Code Playgroud)
现在连接已建立,一切似乎都正常工作(保存前端粉红色消息窗口中的一条消息)
评估Manipulate[n, {n, 0, 100, 1}].首先,这似乎也有效.现在玩滑块.前端迟早会冻结,需要被杀死.对我来说,向上和向下拖动滑块约10秒而不释放它总是足够的.
为什么前端会冻结? 如何以一切正常工作的方式在前端和内核之间创建TCPIP模式连接?
一些说明:
LinkProtocol -> "SharedMemory".是否可以使用Mathematica的其他语言的计算能力?我需要做一些复杂的操作(不一定是象征性的,顺便说一句),能够直接从我的python/c#程序中调用Mathematica的函数或运行Mathematica的代码是非常可爱的.
可能吗?
是否可以使用Install[]自定义PATH环境变量启动MathLink程序?
我正在尝试使用mEngine将Mathematica连接到Windows上的MATLAB.只有mEngine.exe在PATH环境变量包含MATLAB库的路径时才会启动它.是否可以修改PATH以仅启动此程序,而无需修改系统路径?还是有其他方式推出mEngine.exe?
我用来MathLink从C++应用程序发送和接收独立的mma表达式作为字符串.
std::string expression[N];
// ...
for(int i = 0; i < N; ++i) {
MLPutFunction(l, "EnterTextPacket", 1);
MLPutString(l, expression[i].c_str());
MLEndPacket(l);
// Check Packet ...
const char* result;
MLGetString(l, &result);
// process result ...
MLDisownString(l, result);
}
Run Code Online (Sandbox Code Playgroud)
我希望MLDisownString释放已用过的内存,除非它没有.
有任何想法吗?
我想使用VB.Net 2010开发一个程序,我想通过.NET/Link使用Mathematica 3DPlot函数.我的问题是,是否可以在没有安装Mathematica的情况下在另一台计算机上运行该程序?谢谢
我只想将一个整数列表传递给用C++编写的函数.我已经设置了模板(.tm)文件和所有,我可以成功调用标量参数的测试函数.使用list参数调用函数的行为就好像根本没有定义函数一样.我怀疑参数类型不匹配.
在模板文档(http://reference.wolfram.com/mathematica/ref/file/file.tm.html)中,列表的数据类型类似于"Int32List".当我使用它时,我的C++函数必须包含列表长度的超长参数.使用列表的唯一示例代码是"sumalist.tm".此示例使用IntegerList(未出现在doku中的类型).
当我使用Int32List时,mprep结果需要一个带有额外整数参数的函数(不要像在doku中写的那样长).当我使用未记录的IntegerList类型时,额外参数的类型为long.
在我使用标量类型的实验中,我遇到了类似的问题 - 在tm文件中使用"Integer"时,c ++函数被正确调用,而不能用"Integer32"识别.
"sumalist.tm"示例也使用了一个奇怪的模式(list:{___ Integer}),我没有找到任何文档.我还想了解Evaluate行的含义(我怀疑它的使用是使函数可调用而没有列表中的花括号).
那么谁知道哪些数据类型真的适合用列表调用c ++函数 - 也许还有实数...?