问题标签 [mathlink]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
288 浏览

c# - 从 MathLink 连接中获取数据

我正在尝试创建一个使用 .NET/Link 协议调用 Mathematica 8 的 C# 库 (DLL)。具体来说,我将它用于 FFT 等。现在我正在使用 EvaluateToOutputForm 并将结果字符串解析为双精度数。每当我尝试使用 Evaluate() 和 GetDoubleArray() 时,它都会给出我试图从错误维度的数据中读取的错误消息(异常)。即使使用 Evaluate("2+2") 然后 GetInteger() 失败,错误是等待数据不是整数(基本上)。

EvaluateToOutputForm() 的问题在于,我从 Abs@Fourier[data] 解析的数字对于非平凡的(例如相当长的)输入是错误的。我不知道出了什么问题。这里有人可以帮助我吗?

0 投票
2 回答
460 浏览

c# - 如何将选项放入 MathLink 中的函数中

这与我之前的问题有点相关,但有所不同。如果不使用 Evaluate() 等,我无法弄清楚如何提供 MathLink 函数选项。例如,我有以下 C# 代码:

它不起作用。它将 FourierParameters 部分作为文字字符串,而不是选项。我尝试使用该字符串创建一个 Expr 并将其放入,但这也失败了。这甚至可以在 .NETLink 中完成吗?

0 投票
2 回答
172 浏览

c# - 在 MathLink 中设置 ComplexType

我还有一个。我尝试ml.ComplexType = System.Type.GetType("Complex");在 C# 中使用 Mathematica MathLink,但是当我尝试使用 GetComplexArray 读取数字时,它抛出了一个异常,指出我必须使用IMathLink.SetComplexType()似乎不存在的方法。

有没有办法在不解析字符串的情况下做到这一点,因为我一生都不能正确地做到这一点?

0 投票
2 回答
306 浏览

wolfram-mathematica - Mathlink 内存使用累积

我用来MathLinkC++应用程序中以字符串形式发送和接收独立的 mma 表达式。

我希望这会MLDisownString释放已使用的内存,但它不会。

有任何想法吗?

0 投票
3 回答
3006 浏览

c++ - Mathematica:MathLink 错误消息

我想我开始了解如何将用 C/C++ 编写的函数链接到Mathematica。我面临的问题是我不知道如何将错误消息从我的 C 包装器发送到 Mathematica。在谷歌搜索后,我找到了这个MathLink 教程

第 1.7 节让我了解了如何发送错误消息,但我得到了奇怪的结果。这是我正在使用的代码。


文件 cppFunctions.h 声明了类PointLine. 除了我想在Mathematica中使用的函数之外,我已经将这个类剥离到了最简单的部分。我想找到从一条线到另一条线的距离。这个函数是MathematicalineInt中线框的 C 版本。要在Mathematica中使用此函数,我们需要一个包装函数,该函数从Mathematica获取输入并将输出发送回Mathematica


我创建了两个辅助函数:ML_GetPointML_GetLine帮助我从Mathematica获取输入。一行是从包含两个列表的列表中获得的。每个子列表是 2 个实数(一个点)的列表。要在 Mathematica 中尝试此功能,我们需要更多文件。


该文件指出函数 LineDistance 将手动获取参数并返回一个实数。最后两行很重要。第一个Evaluate声明usage函数的。?LineDistance当输入到Mathematica时,它会给出关于函数的简短信息。另一个Evaluate是我希望在出现错误时使用的那个(稍后会详细介绍)。


最后一个文件是 Makefile。至此,我们都准备好在 Mathematica 中测试该函数了。


我之前应该提到我使用的是 Mac OS X,我不确定这将如何在 Windows 上运行。在 mlwrapper.cpp 中,主函数需要更多代码,您可以在Mathematica提供的示例之一中找到这些代码。

在终端我知道这样做:

这使得可执行文件mlwrapper。现在我们可以开始使用 Mathematica:

]

我们得到的输出如下:

输出

只要您输入正确的参数,一切都会正常工作。也就是说,2 个列表,每个列表都是 2 个列表的 2 个双打列表。如果您知道如何让我知道,也许还有另一种获取输入的方法。如果我们坚持这种方法,我们所需要的只是让Mathematica用户知道是否有任何错误。一个非常简单的方法是输入错误。假设我输入了这个:

输出是$Failed。以下情况如何:

输出是LineDistance[{{1, -1}, {1, 1}}]。我猜会发生这种情况,因为我们在Pattern第 1 节中描述了.tm该函数接受两个列表,并且由于我们只给出了一个列表,因此它与模式不匹配。这是真的?

无论如何,按照我找到的教程,让我们修改文件 mlwrapper.cpp 如下:

并将以下内容添加到 mlwrapper.tm 文件的末尾

现在让我们使用 make 并尝试在 Mathematica 中犯一些错误。

我正在发布输出的屏幕截图,而不是编写所有内容。

输出

注意我们重复调用后如何得到不同的错误。似乎该函数在遇到错误后继续在该行。如果我不使用函数中的任何其他 ML 函数,ML_Attempt而我只使用MLEvaluate发送错误标签,则 MathLink 已损坏,我必须重新安装链接。有谁知道如何从 C向Mathematica发送错误消息?


更新:

根据已经给出的答案和另一个有用的文件(第 8 章),我设法使它工作。代码目前不是很漂亮,但这让我问了以下问题。是否可以提前终止功能?在常规的 C 程序中,如果我遇到错误,我会打印错误消息并使用该exit函数。我们可以做类似的事情吗?如果我们使用该exit功能,链接将被破坏,我们将不得不重新安装该功能。以函数ML_GetPointML_GetLine为例。如果这里发生错误,那么在 main 函数中进行计算就没有意义了LineDistance。我们需要清除我们获得的任何错误,向 Mathematica 发送一条指定错误的消息,现在退出并等待下一次调用。

0 投票
1 回答
406 浏览

c - 传递具有不同结构的 MathLink 函数列表

我一直在开发一个带有接受两个列表的函数的 MathLink 应用程序,例如

我打算手动拉入该功能。两个列表都可以是实数或复数,如果任一参数为复数,则结果为复数。此外,fi可以是方阵列表,但zi要保持一维列表。

MathLink C API中,使用起来最直接的函数是MLGetReal64Array可以处理实数和复数数据类型,如数组Complex的最内层所示。Head并且,一旦确定了复杂性,可以将数组强制转换std::complex<double>为 C99 复杂类型(如果合适)。现在,MLGetReal64Array不处理 non-rectangular Lists,因此每个List元素必须具有其他元素的维度并且属于同一类型:实数或复数。不过奇怪的是,对于一个接受单个List参数的函数,它会MLGetReal64Array返回一个数据结构,该数据结构具有一个元素List作为其最外层元素,即在事物的 c 端输入h[ {1, 3, 5} ]返回值。List[List[1,3,5]]

事实证明,对于两个列表函数,例如g,一次调用MLGetReal64Array将同时返回两个参数,即g接收List[ zi, fi ]。由于我计划对每个列表进行预处理以实现结构和元素类型的一致性,因此确保两者具有相同的元素类型不会成为问题。但是,我想fi成为一个矩阵列表,并MLGetReal64Array导致MLEGSQ: MLGet() called out of sequence错误。

所以,我的问题是:我可以MLGetReal64Array用来获取两个列表吗?我该怎么办?而且,如果我不能使用MLGetReal64Array,我的替代方案是什么?

我在想,如果MLGetReal64Array结构正确,我可以List通过使用将外部从链接中弹出MLGetFunction,然后允许我使用MLGetReal64Array每个参数。到目前为止,我还没有尝试过。但是,与此同时,我将不胜感激任何建议。

0 投票
1 回答
285 浏览

wolfram-mathematica - Mathlink 和延迟评估/变量

我有一个用 Fortran 编写的标量函数,我通过一个小的 mathlink 模块在 Mathematica 中使用它。我希望这个函数的行为尽可能接近原生 Mathematica 函数,包括它对符号常量的处理。

很多时候,我希望在mathematica 中写一些带有符号常量/变量的表达式,这些常量/变量将在后面被替换规则列表替换。但是,Mathematica 立即尝试使用适当的符号参数评估我的 mathlink 函数,但显然失败了。例如,即使是下面的简单表达式也会失败

有没有办法延迟函数的评估,直到所有符号参数都被数字替换?

我使用的一种不太优雅的方法取得了一些成功(但如果我希望将此函数包含在通用mathematica 包中以与同事共享,这是不可接受的)是使用对外部函数的“虚拟”引用来评估所有内容,然后使用在评估所有其他数值常数的同时,将所有虚拟引用交换为真实引用的替换规则。例如

0 投票
1 回答
4775 浏览

wolfram-mathematica - 如何在 Mathematica 中使用 FORTRAN 子程序或函数?

我有兴趣在 Mathematica 会话中调用 fortran 代码。我了解到 Mathlink 提供了一种方法来做到这一点。但是我对C知之甚少,对C++一无所知。有人愿意给我一个详细的例子吗?

我正在使用 Mathematica 8、MS Visual Studio 2008 和 Intel Fortran 11。系统是 Windows 7 Home Premium。

非常感谢!

0 投票
3 回答
413 浏览

c - 如何使外部 Mathematica 函数可中断?

我之前有一个关于将 Mathematica 与用 C++ 编写的函数集成的问题。

这是一个后续问题:

如果计算时间太长,我希望能够使用Evaluation > Abort Evaluation中止它。答案中建议的哪些技术使具有可中断的基于 C 的扩展功能成为可能?C端如何实现“可中断性”?

我需要以一种既不会破坏它也不会破坏 Mathematica 内核的方式使我的函数可中断(即应该可以在 Mathematica 被中断后再次调用该函数)

0 投票
1 回答
668 浏览

interop - 使用任意 PATH 环境安装 MathLink 程序

是否可以使用自定义环境变量Install[]启动 MathLink 程序?PATH

我正在尝试使用mEngine将 Mathematica 连接到 Windows 上的 MATLAB。只有在环境变量包含 MATLAB 库的路径mEngine.exe时启动它才有效。PATH是否可以修改 PATH用于启动该程序,而无需修改系统路径?还是有其他的启动方式mEngine.exe